Tout ce que vous devez comprendre ici est la différence entre FunctionExpression s et FunctionDeclaration s en Javascript.
Lorsque vous entourez fonction entre parenthèses -
(function sayHello (name) {
alert("Hello there " + name + "!");
})("Mike");
- vous, techniquement, appliquer un opérateur de regroupement lui. Une fois appliquée, la production globale n'est plus une FunctionDeclarataion, mais une FunctionExpression. Comparer -
function foo(){ } // FunctionDeclaration
(function foo(){ }); // FunctionExpresson
typeof function(){ }; // FunctionExpression
new function(){ }; // FunctionExpression
FunctionExpression (contrairement à FunctionDeclaration), comme tout autre MemberExpresson peut être jointe à Arguments ("(" et ")") et se traduira par l'invocation de la fonction. C'est exactement pourquoi la fonction est appelée dans votre premier exemple et non dans une seconde.
Notez que FunctionExpression s sont autorisés à avoir en option Identifiant s (contrairement à FunctionDeclaration s qui doit toujours avoir un), de sorte que vous pouvez facilement omettre « sayHello » et se retrouver avec soi-disant fonction anonyme expression -
(function(){
alert('...');
});
Vous pouvez consulter my article on named function expressions, qui plonge dans les détails subtils de différence entre les expressions de fonction et les déclarations de fonctions dans beaucoup plus de détails.
Merci les gars - Je ne cherche pas vraiment à faire fonctionner cela, mais plutôt j'écris un cours JavaScript dans lequel j'essaie de donner aux étudiants une bonne compréhension de ce qui se passe réellement . Si je comprends bien (! Peut-être imparfaite) est que: fonction foo() {} était juste un raccourci pour: var foo = function() {} et qui étaient * vraiment * anonyme toutes les fonctions JavaScript, mais nous avons eu des références à eux, c'est pourquoi le fait qu'une forme a fonctionné mais l'autre ne m'a pas perplexe. Ce que je voulais vraiment, c'était le plus radical: function() {}(); –