473 votes

Quelle est la différence entre une déclaration de vs expression de fonction en Javascript ?

Quelle est la différence entre les lignes de code suivantes :

Ce qui est une expression de fonction nommée et comment les navigateurs d’aborder ces constructions différemment ?

Ce qui ne les réponses à une question similaire (http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname) pas tout à fait exact ?

401voto

Khon Lieu Points 1239

Ils sont en fait très similaires. Comment vous les appelez, est exactement le même, mais la différence réside dans la façon dont le navigateur charge dans le contexte d'exécution.

les déclarations de fonction des charges avant le code est exécuté.

Alors que les expressions de fonction charge uniquement lorsque l'interprète atteint cette ligne de code.

Donc, si vous essayez d'appeler une fonction d'expression avant qu'il soit chargé, vous recevrez un message d'erreur

Mais si vous appelez une déclaration de fonction, ça va toujours. Parce que le code ne peut être appelé jusqu'à ce que toutes les déclarations sont chargés.

ex. Expression De Fonction

alert(foo()); // ERROR! foo wasn't loaded yet
var foo = function() { return 5; } 

ex. Déclaration De La Fonction

alert(foo()); // Alerts 5. Declarations are loaded before any code can run.
function foo() { return 5; } 

Comme pour la deuxième partie de vos questions.

var foo = function foo() { return 5; } est vraiment la même chose que les deux autres. C'est juste que cette ligne de code utilisé pour provoquer une erreur dans safari. Je ne sais pas si elle le fait encore. N'ai pas essayé.

107voto

geniuscarrier Points 993

DÉCLARATION DE LA FONCTION

function foo() { ... }

Du fait de la FONCTION de LEVAGE, la fonction déclarée de cette façon peut être appelé à la fois avant et après la définition.

EXPRESSION DE FONCTION

  1. NOMMÉ EXPRESSION DE FONCTION

    var foo = function bar() { ... }

  2. FONCTION ANONYME EXPRESSION

    var foo = function() { ... }

foo() peut être appelée qu'après la création.

IMMÉDIATEMENT APPELÉE À LA FONCTION D'EXPRESSION (IIFE)

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

Conclusion?

Crockford recommande d'utiliser la fonction d'expression, car il est clair que foo est une variable contenant une valeur de la fonction. Eh bien, personnellement, je préfère utiliser la Déclaration, sauf si il y a une raison pour l'Expression.

20voto

TomTom Points 358

3e définition en ce qui concerne :

Voici un exemple qui montre comment utiliser la possibilité de récursive appel :

Edit : exemple plus intéressant avec fermetures :

12voto

Alex Points 6968

La première instruction dépend du contexte dans lequel elle est déclarée.

Si elle est déclarée dans le contexte mondial, il faudra créer un implicite variable globale appelée "foo" qui sera une variable qui pointe vers la fonction. Ainsi, l'appel de la fonction "foo()" peut être fait n'importe où dans votre programme javascript.

Si la fonction est créée par une fermeture à créer un implicite variable locale appelée "foo", que vous pouvez ensuite utiliser pour appeler la fonction à l'intérieur de la fermeture par "foo()"

EDIT:

J'aurais aussi dit que les instructions de fonction (Le premier) sont analysées avant les expressions de fonction (Les 2 autres). Cela signifie que si vous déclarez la fonction au bas de votre script, vous serez toujours en mesure de l'utiliser dans la partie supérieure. Les expressions de fonction seulement évaluée comme on est frappé par l'exécution du code.

FIN EDIT

Les énoncés 2 et 3 sont à peu près équivalents. De nouveau, si elle est utilisée dans le contexte mondial, ils vont créer des variables globales et s'il est utilisé à l'intérieur d'une fermeture de créer des variables locales. Toutefois, il est intéressant de noter que l'instruction 3 ignore le nom de la fonction, de sorte esentially que vous pourriez appeler la fonction de quoi que ce soit. Donc

var foo = function foo() { return 5; }

Est le même que

var foo = function fooYou() { return 5; }

1voto

Jake Points 358

Si le complet de la différence est plus compliqué, la seule différence qui me concerne, c'est quand la machine crée la fonction de l'objet. Qui, dans le cas de déclarations est avant tout de l'instruction, mais après une déclaration corps est invoquée (que le code mondial du corps ou d'une sous-fonction), et dans le cas d'expressions, c'est quand la déclaration est en est exécuté. Autres que que, pour toutes fins utiles, les navigateurs traiter de la même manière.

Pour vous aider à comprendre, jetez un oeil à cette performance test qui busted une hypothèse que j'avais faite en interne les fonctions déclarées n'ayant pas à être re-créé par la machine au moment de l'extérieur de la fonction est appelée. Une sorte de honte, aussi, comme j'ai aimé l'écriture de code de cette façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X