web-dev-qa-db-fra.com

Emplacement des parenthèses pour l'exécution automatique des fonctions JavaScript anonymes?

Je comparais récemment la version actuelle de json2.js avec la version que j'avais dans mon projet et j'ai remarqué une différence dans la façon dont l'expression de fonction a été créée et exécutée automatiquement.

Le code utilisé pour encapsuler une fonction anonyme entre parenthèses, puis l'exécuter,

(function () {
  // code here
})();

mais maintenant, il encapsule la fonction auto-exécutée entre parenthèses.

(function () {
  // code here
}());

Il y a un commentaire par CMS dans la réponse acceptée de Expliquez la syntaxe de la fonction anonyme encapsulée de JavaScript que "les deux: (function(){})(); et (function(){}()); sont valides."

Je me demandais quelle est la différence? Le premier prend-il de la mémoire en laissant autour d'une fonction globale et anonyme? Où doit-on situer les parenthèses?

105
Kevin Hakanson

Ils sont pratiquement les mêmes.

La première enveloppe des parenthèses autour d'une fonction pour en faire une expression valide et l'invoque. Le résultat de l'expression n'est pas défini.

Le second exécute la fonction et les parenthèses autour de l'invocation automatique en font une expression valide. Il évalue également à undefined.

Je ne pense pas qu'il y ait une "bonne" façon de procéder, car le résultat de l'expression est le même.

> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
64
meder omuraliev

Dans ce cas, cela n'a pas d'importance. Vous appelez une expression qui se résout en fonction dans la première définition et définissez et appelez immédiatement une fonction dans le deuxième exemple. Ils sont similaires car l'expression de la fonction dans le premier exemple n'est que la définition de la fonction.

Il existe d'autres cas plus évidemment utiles pour appeler des expressions qui se résolvent en fonctions:

(foo || bar)()
13
Triptych

Il n'y a aucune différence au-delà de la syntaxe.

En ce qui concerne vos préoccupations concernant la deuxième méthode de le faire:

Considérer:

(function namedfunc () { ... }())

namedfunc ne sera toujours pas dans la portée globale même si vous avez fourni le nom. Il en va de même pour les fonctions anonymes. La seule façon de l'obtenir dans cette portée serait de l'assigner à une variable à l'intérieur des parens.

((namedfunc = function namedfunc () { ... })())

Les parens extérieurs ne sont pas nécessaires:

(namedfunc = function namedfunc () { ... })()

Mais vous ne vouliez pas de toute façon cette déclaration globale, n'est-ce pas?

Donc, cela se résume à:

(function namedfunc () { ... })()

Et vous pouvez le réduire encore plus: le nom est inutile car il ne sera jamais utilisé (sauf si votre fonction est récursive .. et même alors vous pourriez utiliser arguments.callee)

(function () { ... })()

C'est ainsi que j'y pense (peut-être incorrect, je n'ai pas encore lu la spécification ECMAScript). J'espère que ça aide.

9
Cristian Sanchez