2009-08-19 10 views
3

Kann jemand erklären, warum dies funktioniert:Einfache JavaScript-Funktion mit sofortigem Aufruf funktioniert nicht ... warum?

var sayHello = function (name) { 
    alert("Hello there " + name + "!"); 
}("Mike"); 

Während dies nicht:

function sayHello (name) { 
    alert("Hello there " + name + "!"); 
}("Mike"); 

Mike Peat

+0

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() {}(); –

Antwort

0

Herausgegeben weil meine Antwort falsch die Original-Beitrag gelesen hatte:

Wie Ihre Funktion wird nicht mehr als Lambda-Funktion einem Wert zugewiesen, das Aufrufen der Funktion danach mit ("Mike") funktioniert nicht a Es gibt keinen Wert, den Aufruf aufzurufen. Wie andere vorgeschlagen diese mit Klammern Einwickeln einer temporären Variablen erstellen werden Sie noch die anonyme Funktion aufrufen lassen: eigentlich

(function sayHello (name) { 
    alert("Hello there " + name + "!"); 
})('Mike'); 
+0

Aber ich denke, er versucht auch, eine selbstaufrufende Funktion zu erstellen. – Brian

+0

Ah ja, das ist korrekt. Das wird in diesem Kontext nicht funktionieren, weil es niemals einem Wert zugewiesen wird, der dann aufgerufen wird. Mein Fehler. Wird bearbeiten. –

4

Ihre zweite Code:

function sayHello (name) { 
    alert("Hello there " + name + "!"); 
} 

("Mike"); 

So sind Sie zum ersten Mal erklärt Funktion „sayHello“ und dann führen Sie die "Anweisung" aus:

was nichts tut.

+0

Dies beantwortet jedoch nicht, was er eigentlich tun möchte, was die anonyme Funktion aufruft. Sieh Brians Antwort. –

+1

Es erklärt, warum es nicht funktioniert, was GENAU das ist, was das OP gefragt hat. –

+0

Philippe - das ist richtig, denke ich, aber was ich nicht sehen konnte, ist, dass in der ersten Form die Zuordnung von Lambda zu var * eigentlich halbiert sein sollte (eine Tatsache, die durch die Klammern der Funktion getarnt ist) body), was es dem ("Mike") erlaubt, die Funktion aufzurufen. Ist das richtig, denkst du? –

3

Dies funktioniert:

(function sayHello (name) { 
     alert("Hello there " + name + "!"); 
    })("Mike"); 

Beachten Sie die Pars selbst die Funktion wickeln. Sie können auch den Funktionsnamen "sayHello" entfernen und es funktioniert weiterhin. Soweit warum? Ich bin nicht positiv. Vielleicht ist es das, indem Sie es einer Variablen zuweisen und nicht die wrapping() 's verwenden, Sie ordnen es tatsächlich sayHello zu und führen dann hallo, nicht die anonyme Funktion aus.

0

die Funktionsdefinition in () Umgebung, bevor es Aufruf funktioniert:

(function sayHello(name) { 
    alert("Hello there " + name + "!"); 
})("Mike"); 

// however -- 
alert(typeof sayHello); // undefined 

So etwas wie, dass, wenn Sie wollen - man könnte genauso gut machen es nur eine anonyme Funktion:

(function(name) { 
    alert("Hello there " + name + "!"); 
})("Mike"); 

Und ich bin mir nicht sicher, dass es erforderlich ist - aber aus Sicherheitsgründen - immer wenn ich einen Verschluss verwende, wickle ich ihn immer in ()

1
var sayHello = function (name) { 
    alert("Hello there " + name + "!"); 
}("Mike"); 

Dies erstellt eine anonyme Funktion und ruft sie sofort mit dem Parameter "Mike" auf. Dann wird der Rückgabewert dieses Funktionsaufrufs der Variablen sayHello zugewiesen.

function sayHello (name) { 
    alert("Hello there " + name + "!"); 
}("Mike"); 

Dies definiert nur eine normale Funktion mit dem Namen sayHello und die Funktion Anweisung endet nach dem Schließen}. Dann folgt die ("Mike") Aussage, die gültig ist, aber nichts tut.

+0

Es gibt keine "normale" Funktion. 'function sayHello() {}' ist nur eine Kurzform für 'var sayHello = function() {}'. Siehe Crockfords * JavaScript: The Good Parts * für weitere Referenzen. –

+0

Ah! Aber das hilft mir zu verstehen! Funktion foo()() kann/ist effektiv/shorthand für var foo = function() {}, aber ersteres ist eine function-Anweisung, während letzteres die Zuweisung des Ergebnisses einer function-Anweisung zu einer Variablen ist. Ich glaube, ich werde hier klarer werden! ;-) (Aber ich bin noch nicht/ganz/da!) –

13

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.

+0

Danke kangax - lese jetzt deinen Artikel! ;-) –

+0

Es scheint als wäre dein Artikel verlinkt. (Daher) Einige zusätzliche Ressourcen: http: //kangax.github.com/nfe /, http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascrip, http://stackoverflow.com/questions/939386/Javascript-Immediate-Function-Aufruf-Syntax, http://my.safaribooksonline.com/book/programming/javascript/9781449399115/functions/immediate_functions – SunnyRed

+0

Danke, diesen Link aktualisiert. – kangax