110 votes

Syntaxe d'invocation de fonction immédiate

Il existe un JSLint une option, l'une des bonnes parties en fait, qui "[exige] des parenthèses autour des invocations immédiates", ce qui signifie que la construction

(function () {

  // ...

})();

devrait plutôt ê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-elle plus résiliente ? Moins sujette aux erreurs ? Quel avantage présente-t-elle par rapport à la première forme ?


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érons 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 extérieures ne soient pas nécessaires d'un point de vue syntaxique, la parenthèse ouvrante indique d'emblée que la valeur assignée est pas la fonction elle-même, mais plutôt le résultat de la fonction invoquée.

Ce conseil est similaire à celui de Crockford concernant l'emploi de la majuscule pour les fonctions de constructeur - il est destiné à servir de repère visuel à toute personne regardant le code source.

73voto

altCognito Points 23944

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

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

En gros, il estime que cela rend plus claire la distinction entre les valeurs des fonctions et les valeurs des fonctions. Il s'agit donc d'une question de style, et non d'une différence substantielle dans le code lui-même.

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

2voto

Dathan Points 404

Les fonctions anonymes appelées immédiatement sont mises entre parenthèses parce que.. :

  1. Il s'agit d'expressions de fonctions et l'omission des parens serait interprétée comme une déclaration de fonction, ce qui constitue une erreur de syntaxe.

  2. Les expressions de fonction ne peuvent pas commencer par le mot fonction.

  3. Lors de l'affectation de l'expression de la fonction à une variable, la fonction elle-même n'est pas renvoyée, mais la valeur de retour de la fonction. Les parenthèses évaluent donc ce qui se trouve à l'intérieur et produisent une valeur. lorsque la fonction est exécutée, et les parenthèses arrière ..}() provoquent l'exécution immédiate de la fonction.

-3voto

Agamemnus Points 154

Ou, utilisez :

void function () {
...
} ()

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