Doublons Possibles:
Quelle est la différence entre une fonction d'expression vs déclaration en Javascript?
Expliquer JavaScript est encapsulé anonyme syntaxe de la fonctionPourquoi ce:
(function () { //code }());
et ceci:
var f = function () { //code }();
œuvres, bien que ceci:
function () { //code }();
ne fonctionne pas? Il ressemble exactement la même fonction anonyme définie, et a immédiatement appelé. Quelqu'un peut-il faire un devis à partir de Javascript/ECMAScript standard qui explique cela?
Probablement une question stupide, mais je ne peux pas dormir. :)
Mise à JOUR: merci pour les réponses de tout le monde! Donc il s'agit de la fonction d'expression et de déclaration de fonction. voir cette SORTE de réponse, ECMAScript standard de l'article 13, et cet excellent article: http://kangax.github.com/nfe/.
Pour résumer les réponses:
Premier extrait de code est interprété comme l'expression en raison de regroupement de l'opérateur
()
appliquée - voir le standard ECMAScript l'article 11.1.6.Dans le deuxième extrait de fonction est interprété comme l'expression parce que c'est sur la partie droite de l'opérateur d'assignation
=
.Troisième extrait de ne pas avoir quelque chose qui permet à l'interprète de la fonction de lecture que l'expression, de sorte que son une déclaration, qui n'est pas valide sans identifiant (Gecko permet de passer cependant, mais elle s'étouffe sur suivant
()
regroupement de l'opérateur (comme il le pense) appliquée à rien).
Réponses
Trop de publicités?Les deux premiers cas montrent les expressions de fonction, et peut apparaître n'importe où une expression comme (1+1
ou x*f(4)
). Juste comme la façon dont 1+1
, évalue 2
, ces expressions sont évaluées à une fonction correspondante.
Le troisième cas est une fonction declation déclaration, et peuvent apparaître n'importe où vous pouvez avoir d'autres états (comme un if
ou while
déclaration).
Il n'y a pas beaucoup de point en essayant de déclarer une fonction anonyme via une Fonction instructions de déclaration, car sinon personne ne ferait d'obtenir une référence à la fonction par la suite.
La raison vous avez besoin de l'ouverture d' (
ou var x =
comme dans les deux premiers cas, c'est qu'ils vigueur prochaine peu être analysée dans un contexte d'expression. (il suffit de penser comment vous ne cant var x = if ...
, par exemple). Si vous venez de mettre l' function
que la première chose qu'il va être analysée comme la déclaration que vous ne voulez pas.
Les deux premiers sont quelque chose qui s'appelle une fonction d'expression, signifie qu'elle est en ligne et interprété comme le code JS s'exécute.
La 3ème est une déclaration de fonction et est interprété lorsque le code est compilé. Depuis qu'il est interprété lors de la compilation, vous ne pouvez pas le lancer immédiatement car aucune des autres code autour de lui a été lancé.
Pour montrer un exemple:
// foo == undefined
// bar == function
function bar(){ .. }
var foo = function(){ ... }
// foo == function
// bar == function
Mis simplement, à tout moment, vous avez la parole function
sans rien qui le précède, c'est une déclaration. Tout le temps quelque chose qui la précède, c'est une expression.
Les fonctions anonymes sont bien expliquées ici: Comment fonctionne une fonction anonyme en JavaScript?
Voici une façon simple de penser à elle: Si function
est le premier mot-clé sur la ligne, l'analyseur va interpréter le reste de la ligne comme une déclaration de fonction. En d'autres termes, il pense que vous êtes en train d'écrire quelque chose comme ça, comme si vous avez oublié le nom de votre fonction:
function foo(){
// code
}
Le moyen de contourner ce problème consiste à envelopper l'ensemble de la fonction à l'intérieur de certaines parens ou de faire partie d'une affectation de variable. Dans les deux cas, vous êtes de mettre function
plus en arrière sur la ligne et permettre l'analyseur de reconnaître que vous n'êtes pas écrit une déclaration de fonction.
Il semble insignifiant pour moi afin de permettre function
à apparaître au début d'une ligne et encore la distinction entre les expressions de fonction et les déclarations de fonction, mais je suppose que ce n'était pas si anodin en arrière quand le JavaScript a d'abord été conçu.