2 votes

problème d'analyse des fonctions anonymes auto-invoquantes

J'ai du mal à comprendre comment ces deux lignes sont interchangeables.

( function() { return console.log("anon inner 1"); } ) ();
//                                                     ^^ invoke

( function() { return console.log("anon inner 2"); } () );
//                                                   ^^ invoke

Dans la première ligne, nous avons une fonction interne anonyme qui est enveloppée dans des parenthèses, puis immédiatement invoquée. Dans la deuxième ligne, nous avons une fonction interne anonyme qui est invoquée et ensuite mise entre parenthèses.

Je suppose que ma question est la suivante : à quoi sert l'habillage entre parenthèses ? Est-ce qu'il objective les choses, c'est-à-dire les transforme en objets ?

3voto

nnnnnn Points 70578

JavaScript a une fonction déclaration qui est la façon "standard" de déclarer une fonction, avec la syntaxe :

function name([param1, 2...]) {
   statements
}

Et il existe une fonction _opérateur_ qui se présente de la même manière que l'instruction de fonction, sauf que le nom est facultatif et qu'il n'est pas utilisé comme une instruction à part entière, mais comme un substitut de l'instruction de fonction. expression est attendu comme dans les deux exemples suivants :

// declare variable name that references a function created by expression
var name = function([param1, 2...]) { statements };
// call someOtherFunction that expects a function as a parameter
someOtherFunction(function() { });

(Il existe de nombreuses autres façons d'utiliser les expressions de fonctions).

Si vous essayez de placer une fonction anonyme sur une ligne sans l'entourer de parenthèses, elle sera considérée comme une fonction. déclaration et donc une erreur de syntaxe car il n'y a pas de nom. En le mettant entre parenthèses, il sera traité comme une expression. à l'intérieur des parenthèses et non comme une déclaration, donc le nom est facultatif. Si vous affectez le résultat de l'expression de fonction à une variable ou si vous l'utilisez d'une autre manière (comme dans mes exemples ci-dessus), vous n'avez pas besoin des parenthèses.

Pour en venir (enfin) à la syntaxe mentionnée dans la question : une fois que vous avez les parens et que votre fonction est traitée comme une expression, vous pouvez utiliser l'une des deux syntaxes que vous avez affichées pour l'invoquer. La première, invoquer "à l'extérieur" des parenthèses, signifie que le premier ensemble de parenthèses sera évalué comme ayant la valeur de l'expression à l'intérieur, qui se trouve être une fonction que vous pouvez alors invoquer. La seconde, invoke "inside", signifie que l'expression de la fonction sera invoquée et que les parens qui l'entourent seront évalués comme ayant la valeur de la fonction.

Dans tous les cas, la valeur de retour de la fonction est jetée parce que vous ne l'affectez à rien.

(Note finale : une expression de fonction peut avoir un nom afin que la fonction puisse s'appeler elle-même de manière récursive).

1voto

qwertymk Points 9783

Quand vous avez une fonction d'annonce régulière comme :

function() { alert('testing'); }

c'est un fonction expression . Toute autre vairiation est appelée déclaration de fonction comme les suivantes :

function a() { alert('testing'); }
!function() { alert('testing'); }
var a = function { alert('testing'); }
(function() { alert('testing'); })

Maintenant, un fonction expression ne peut pas être invoquée car elle ne renvoie pas de valeur, mais un fichier déclaration peut. Donc, tout ce que tu dois faire, c'est de le transformer en une sorte de déclaration à invoquer immédiatement, ce que font les parens, qu'elles enveloppent ou non les parens invoquantes. En effet, dès que l'analyseur js voit une parenthèse ouverte, il la transforme en un élément de type déclaration .

Avertissement : il se peut que j'aie mélangé la terminologie de déclaration y expression

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