Il existe une option JSLint , une des bonnes parties en fait, qui "[requiert] 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-ce plus résilient? Moins sujet aux erreurs? Quel avantage a-t-il sur la première forme?
Depuis que j'ai posé cette question, j'en suis venu à comprendre l'importance d'avoir une distinction visuelle claire entre les valeurs de fonction et les valeurs de fonctions. Prenons le cas où le résultat de l'appel immédiat est le côté droit d'une expression d'affectation:
var someVar = (function () {
// ...
}());
Bien que les parenthèses les plus extérieures soient 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 appelée.
Ceci est similaire au conseil de Crockford concernant la capitalisation des fonctions du constructeur - il est destiné à servir de repère visuel à quiconque regarde le code source.
la source
Réponses:
Extrait du guide des conventions de style de Douglass Crockford : (recherchez "invoked immédiatement")
Lorsqu'une fonction doit être appelée immédiatement, l'expression d'appel entière 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.
Donc, fondamentalement, il pense que cela rend plus claire la distinction entre les valeurs de fonction et les valeurs de fonctions. C'est donc une question de style, pas vraiment une différence de fond dans le code lui-même.
référence mise à jour, l'ancien PPT n'existe plus
la source
Les fonctions anonymes immédiatement appelées sont encapsulées dans des parenthèses car:
Ce sont des expressions de fonction et laisser les parenthèses de côté entraînerait son interprétation comme une déclaration de fonction qui est une erreur de syntaxe.
Les expressions de fonction ne peuvent pas commencer par le mot fonction.
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 parents évaluent ce qu'ils contiennent et produisent une valeur.lorsque la fonction est exécutée, et les parenthèses de fin..}()
provoquent l'exécution immédiate de la fonction.la source
Ou utiliser:
la source