Alles, was Sie hier verstehen müssen, ist der Unterschied zwischen FunctionExpression s und FunctionDeclaration s in Javascript.
Wenn Sie Surround-Funktion mit Klammern -
(function sayHello (name) {
alert("Hello there " + name + "!");
})("Mike");
- Sie gelten technisch, eine Gruppierung Betreiber zu. Einmal angewendet, ist die Gesamtproduktion nicht mehr ein FunctionDeclarataion, sondern ein FunctionExpression. Vergleichen -
function foo(){ } // FunctionDeclaration
(function foo(){ }); // FunctionExpresson
typeof function(){ }; // FunctionExpression
new function(){ }; // FunctionExpression
FunctionExpression (im Gegensatz zu FunctionDeclaration), genau wie jedem anderen MemberExpresson mit Argumenten angehängt werden ("(" und ")") und wird in Funktionsaufruf führen. Genau deshalb wird die Funktion in Ihrem ersten Beispiel aufgerufen und nicht in einer Sekunde.
Beachten Sie, dass FunctionExpression s sind erlaubt haben, optional Identifier s (im Gegensatz zu FunctionDeclaration s, die immer eine haben muss), so dass Sie leicht „sayHello“ weglassen und mit so genannten anonymen Funktion am Ende Ausdruck -
(function(){
alert('...');
});
Sie können my article on named function expressions überprüfen, die zwischen Funktionsausdrücken und Funktionsdeklarationen in viel mehr Details in subtilen Details der Unterschied eintaucht.
Danke Leute - Ich versuche nicht wirklich, dass dies funktioniert, aber ich schreibe einen JavaScript-Kurs, in dem ich versuche, den Schülern ein möglichst gutes Verständnis zu vermitteln, was eigentlich vor sich geht . Mein Verständnis (! Möglicherweise fehlerhaft) war, dass: Funktion foo() {} war nur eine Abkürzung für: var foo = function() {} und dass alle Funktionen JavaScript waren * wirklich * anonym, aber das wir hatten Verweise darauf, weshalb mich die Tatsache, dass eine Form funktionierte, aber die andere nicht verwirrte. Was ich wirklich anstrebte, war das noch radikalere: function() {}(); –