web-dev-qa-db-fra.com

Syntaxe d'invocation de fonction immédiate

Il y a une option JSLint , l'une des bonnes parties en fait, qui "[nécessite] des parens autour des invocations immédiates", ce qui signifie que la construction

(function () {

  // ...

})();

aurait plutôt besoin d'être écrit comme

(function () {

  // ...

}());

Ma question est la suivante - quelqu'un peut-il expliquer pourquoi cette deuxième forme pourrait être considérée comme meilleure? Est-il plus résistant? Moins sujet aux erreurs? Quel avantage a-t-il sur le premier formulaire?


Depuis que j'ai posé cette question, j'ai compris l'importance d'avoir une distinction visuelle claire entre les valeurs des fonctions et les valeurs des fonctions. Considérez le cas où le résultat de l'invocation immédiate est le côté droit d'une expression d'affectation:

var someVar = (function () {

  // ...

}());

Bien que les parenthèses les plus à l'extérieur ne soient pas syntaxiquement inutiles, la parenthèse ouvrante donne une indication initiale que la valeur attribuée n'est pas la fonction elle-même mais plutôt le résultat de la fonction étant invoquée.

Ceci est similaire aux conseils de Crockford concernant la capitalisation des fonctions du constructeur - il est destiné à servir de signal visuel à quiconque regarde le code source.

110
Bobby Eickhoff

D'après Douglass Crockford's guide des conventions de style : (recherchez "invoqué immédiatement")

Lorsqu'une fonction doit être invoquée immédiatement, l'expression d'invocation entière doit être mise entre parenthèses afin qu'il soit clair que la valeur produite est le résultat de la fonction et non la valeur fonctionner elle-même.

Donc, fondamentalement, il estime que la distinction entre les valeurs des fonctions et les valeurs des fonctions est plus claire. C'est donc une question stylistique, pas vraiment une différence substantielle dans le code lui-même.

référence mise à jour, ancienne PPT n'existe plus

72
cgp

Les fonctions anonymes immédiatement appelées sont enveloppées de parens car:

  1. Ce sont des expressions de fonction et le fait de laisser des parenthèses à l'extérieur entraînerait son interprétation comme une déclaration de fonction qui est une erreur de syntaxe.

  2. Les expressions de fonction ne peuvent pas commencer par la fonction Word.

  3. Lors de l'affectation de l'expression de fonction à une variable, la fonction elle-même n'est pas renvoyée, la valeur de retour de la fonction est renvoyée, par conséquent, les parens évaluent leur contenu et produisent une valeur. lorsque la fonction est exécutée et les parenthèses de fin ..}() entraînent l'exécution immédiate de la fonction.

2
Dathan