Emplacement de parenthèse pour les auto-exécution anonyme des fonctions JavaScript?
J'ai été récemment en comparant la version actuelle de json2.js avec la version que j'avais dans mon projet et a remarqué une différence dans la façon dont l'expression de fonction a été créée et auto exécuté.
Le code utilisé pour envelopper une fonction anonyme dans la parenthèse, et puis l'exécuter,
(function () {
//code here
})();
mais maintenant, elle enveloppe l'auto-exécution de la fonction dans la parenthèse.
(function () {
//code here
}());
Il y a un commentaire par la CMS dans la accepté de répondre à de Expliquer JavaScript est encapsulé anonyme syntaxe de la fonction que “les deux: (function(){})();
et (function(){}());
sont valides.”
Je me demandais quelle est la différence? Le premier de prendre de la mémoire en laissant autour d'un mondial, en fonction anonyme? Où les parenthèses?
Connexes: Immédiate de l'invocation de la fonction de syntaxe (en JSLint)
Lire aussi à propos de la le but de cette construction, ou de vérifier un (technique) explication (ici). Pourquoi les parenthèses sont nécessaires, voir question.
OriginalL'auteur Kevin Hakanson | 2010-08-02
Vous devez vous connecter pour publier un commentaire.
Ils sont pratiquement les mêmes.
La première encapsule des parenthèses autour d'une fonction pour en faire une expression valide et l'appelle. Le résultat de l'expression n'est pas définie.
Le second s'exécute la fonction et les parenthèses autour de l'invocation automatique en faire une expression valide. Il évalue aussi les indéfinis.
Je ne pense pas qu'il y a une "bonne" façon de le faire, puisque le résultat de l'expression est la même.
En fait vous n'êtes pas limité à ces deux, vous pouvez utiliser juste au sujet de tout ce qui rend le compilateur de réaliser la fonction est une partie d'une expression et non une déclaration, comme
+function(){}()
ou!function(){}()
.JSLint veut beaucoup de choses qui sont spécifiques à Crockford style plutôt que de fond. C'est l'un d'entre eux.
Que recommanderiez-vous? jQuery utilise le premier style et Crockford utilise la deuxième.
Il vraiment n'a pas d'importance, donc faire ce que vous préférez. Je le recommande à l'encontre de certains des plus outre (
-function(){}();
,!function(){}();
, et n'importe quel autre opérateur, juste avantfunction
aussi, mais je me garderais de versions à l'aide de parenthèses). Je vois le premier d'une beaucoup plus que je vois de la seconde, et c'est ma préférence, elle fait plus de sens pour moi, mais c'est subjectif. FWIW: jsbin.com/ejaqowOriginalL'auteur meder omuraliev
Dans ce cas, il n'a pas d'importance. Vous êtes en invoquant une expression qui correspond à une fonction dans la première définition, la définition et immédiatement l'appel d'une fonction dans le deuxième exemple. Elles sont similaires, car la fonction de l'expression dans le premier exemple est juste la définition de la fonction.
Il y a d'autres évidemment des cas utiles pour invoquer les expressions qui se rapportent à des fonctions:
foo = function(){alert('hi');}
. Si aucun n'est une fonction, une erreur est renvoyée.Des précisions - Il permettra également de lever une erreur si
foo
est "truthy", mais pas une fonction.OriginalL'auteur Triptych
Il n'y a pas de différence au-delà de la syntaxe.
Concernant vos préoccupations au sujet de la deuxième méthode de le faire:
Considérer:
(function namedfunc () { ... }())
namedfunc
sera pas encore 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 le champ d'application serait à attribuer à une variable à l'intérieur des parenthèses.L'extérieur des parenthèses sont inutiles:
Mais vous ne voulez pas que la déclaration globale de toute façon, avez-vous?
Donc ça se résume à:
Et vous pouvez réduire encore plus loin: le nom est inutile car il ne sera jamais utilisé (à moins que votre fonction est récursive.. et même alors, vous pouvez utiliser
arguments.callee
)C'est la façon dont je pense à ce sujet (peut-être erronée, je n'ai pas lu la spécification ECMAScript encore). Espérons que cela aide.
arguments.callee
est obsolète depuis ES5 (et interdit en mode strict).OriginalL'auteur Cristian Sanchez
La différence, juste exister que parce que Douglas Crockford n'aime pas le premier style de IIFEs! (seriuosly) Comme vous pouvez le voir dans cette vidéo!!.
La seule raison de l'existence de l'emballage supplémentaire
()
{dans les deux styles} est d'aider à faire que la section de code Expression de Fonction, parce que Déclaration de Fonction ne peut pas être appelé immédiatement. Certains scripts /minify-ers suffit d'utiliser+
,!
,-
&~
au lieu de trop de parenthèses. Comme ceci:Et tous ces sont exactement les mêmes que vos solutions de rechange. Le choix parmi ces cas est complètement sur votre propre & ne fait aucune différence. { Ceux avec
()
produire 1 Octet taille de Fichier 😉 }OriginalL'auteur Behrad Khodayar