La façon dont j'explique généralement cela aux gens est de montrer comment il est similaire à d'autres modèles JavaScript.
Tout d'abord, vous devez savoir qu'il existe deux façons de déclarer une fonction (en fait, il y en a au moins cinq, mais ce sont les deux principales) :
function foo() {/*code*/}
y
var foo = function() {/*code*/};
Même si cette construction semble étrange, vous l'utilisez probablement tout le temps lorsque vous attachez des événements :
window.onload=function(){/*code*/};
Vous remarquerez que la deuxième forme n'est pas très différente d'une déclaration de variable ordinaire :
var bar = 5;
var baz = 'some string';
var foo = function() {/*code*/};
Mais en JavaScript, vous avez toujours le choix entre utiliser une valeur directement ou par le biais d'une variable. Si bar
es 5
alors les deux affirmations suivantes sont équivalentes :
var myVal = bar * 100; // use 'bar'
var myVal = 5 * 100; // don't use 'bar'
Eh bien, si vous pouvez utiliser 5
seul, pourquoi ne pouvez-vous pas utiliser function() {\*code*\}
tout seul aussi ? En fait, c'est possible. Et cela s'appelle une fonction anonyme. Ces deux exemples sont donc également équivalents :
var foo = function() {/*code*/}; // use 'foo'
foo();
(function(){/*code*/})(); // don't use 'foo'
La seule différence que vous devriez voir est dans les crochets supplémentaires. C'est simplement parce que si vous commencez une ligne avec le mot-clé function
le parseur pensera que vous déclarez une fonction en utilisant le tout premier modèle en haut de cette réponse et lancera une exception pour erreur de syntaxe. Enveloppez donc votre fonction anonyme entière dans une paire d'accolades et le problème disparaît.
En d'autres termes, les trois affirmations suivantes sont valables :
5; // pointless and stupid
'some string'; // pointless and stupid
(function(){/*code*/})(); // wonderfully powerful
[EDIT en 2020]
La version précédente de ma réponse recommandait la forme de parens-wrapping de Douglas Crockford pour ces "fonctions anonymes immédiatement invoquées". L'utilisateur @RayLoveless a recommandé en 2012 d'utiliser la version présentée maintenant. À l'époque, avant ES6 et les fonctions fléchées, il n'y avait pas de différence idiomatique évidente ; il fallait simplement empêcher que la déclaration commençant par le signe function
mot-clé. En fait, il y avait de nombreuses façons de le faire. Mais en utilisant les parens, ces deux déclarations étaient syntaxiquement et idiomatiquement équivalentes :
( function() { /* code */}() );
( function() { /* code */} )();
Mais le commentaire de l'utilisateur @zentechinc ci-dessous me rappelle que les fonctions fléchées changent tout cela. Donc maintenant, une seule de ces déclarations est correcte.
( () => { /* code */ }() ); // Syntax error
( () => { /* code */ } )();
Pourquoi diable cela est-il important ? En fait, c'est assez facile à démontrer. Rappelez-vous qu'une fonction flèche peut se présenter sous deux formes de base :
() => { return 5; }; // With a function body
() => { console.log(5); };
() => 5; // Or with a single expression
() => console.log(5);
Si des parens n'entourent pas ce deuxième type de fonction flèche, on se retrouve avec un désordre idiomatique :
() => 5(); // How do you invoke a 5?
() => console.log(5)(); // console.log does not return a function!
2 votes
Êtes-vous intéressé par une "explication formelle", en termes de spécification ECMA-262 ?
1 votes
Lisez à propos de la objectif de cette construction . Jetez un coup d'œil à une explication également aquí . Pour la syntaxe, voir pourquoi les parenthèses sont nécessaires y où ils devraient aller .