2009-03-03 5 views
4

, wenn ich Code:Selbst Aufruf Funktionen

var a = 
function() 
{ 
    alert("44") 
    return function(){alert(33)} 
}()(); 

ist dieser Ausdruck in der folgenden Reihenfolge ausgewertet?

  1. Definieren Sie die Funktion;
  2. passieren seine Referenz Zeiger auf eine
  3. a()
  4. Rückkehr in aa neuen Funktionszeiger
  5. aufgerufen wird
  6. a() wieder
  7. aufgerufen wird

und wenn ja, warum habe ich eine Syntax Fehler, wenn ich tue:

function() 
{ 
    alert("44") 
    return function(){alert(33)} 
}(); 

der Interpreter zuerst einen linken Operanden will ...

aber diese Syntax funktioniert:

(
    function() 
    { 
    alert("44") 
    return function(){alert(33)} 
    }; 

)() 

die äußere Klammer, was Bedeutung hat ???

Dank

Antwort

3

Es ist die Syntax der Sprache. Wenn Sie eine anonyme Funktion in-place ausführen möchten, müssen Sie sie in Parens einschließen.

JS hat diese Randfälle, wo die Syntax seltsamer ist als erwartet. Nehmen wir zum Beispiel an, dass das Auswerten einer Zeichenfolge mit einem JSON nicht funktioniert, wenn sie nicht mit Parens umschlossen ist.

// Wrong 
eval("{ ... }"); 
// Right 
eval("({ ... })"); 

Es ist die Syntax der Sprache.

Das sagte, ich denke (und das ist streng IMHO), die Schritte, die Sie skizziert haben, sind nicht korrekt.

  1. Funktion ist definiert und aufgerufen. Warnung ("44"); passiert als Ergebnis.
  2. Die Funktion gibt eine andere Funktion zurück, die ebenfalls aufgerufen wird. Alarm ("33"); das passiert.
  3. Die innerste Funktion gibt nichts zurück, daher ist a effektiv undefiniert. typeof eine Rückkehr "undefined".
3
  1. function() { alert("44") return function(){alert(33)} } Sie definieren die Funktion
  2. function() { alert("44") return function(){alert(33)} }() Sie diese Funktionfunction(){alert(33)}
  3. anonyme Funktion Rückkehr rufen() Sie Funktionsaufruf zurückgegeben, so ist es tatsächlich entsprichtfunction(){alert(33)}()

So ist die ganze Ausführung entspricht:

alert("44"); alert(33); 
0

Ich lerne gerade selbstaufrufende Funktionen auch.
und ich denke, der Code sollte 3. (function() { alert("44"); return function(){alert(33);} })()()

sein