Frage

, wenn ich Code:

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

ist dieser Ausdruck in der folgenden Reihenfolge ausgewertet?

  1. definieren die Funktion;
  2. passieren seine Referenz Zeiger auf eine
  3. a () aufgerufen
  4. Rückkehr in einem neuen Funktionszeiger
  5. a () aufgerufen wird wieder

und wenn ja, warum ich einen Syntaxfehler, wenn ich tun:

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

Der Dolmetscher will einen linken Operanden zuerst ...

aber diese Syntax funktioniert:

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

)()

die äußere Klammer, was nicht bedeutet ???

Danke

War es hilfreich?

Lösung

Es ist die Syntax der Sprache. Wenn Sie eine anonyme Funktion an Ort und Stelle durchführen möchten, müssen Sie es in Pars einschließen.

JS hat diese Fälle Kante, wo die Syntax ist seltsamer als Sie erwarten. Nehmen Sie zum Beispiel, evaling eine Zeichenfolge, die eine JSON hat nicht funktioniert, wenn es mit Pars gewickelt wird.

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

Es ist die Syntax der Sprache.

Das heißt, glaube ich (und das ist streng IMHO), die Schritte, die Sie skizziert haben, sind nicht korrekt.

  1. Funktion definiert und aufgerufen. alert ( "44"); geschieht als Folge.
  2. Die Funktion gibt eine andere Funktion, die auch aufgerufen wird. alert ( "33"); passiert.
  3. Die innerste Funktion gibt nichts zurück, so dass ein effektiv nicht definiert. typeof ein returns "undefined".

Andere Tipps

  1. function() { alert("44") return function(){alert(33)} } Sie definieren die Funktion
  2. function() { alert("44") return function(){alert(33)} } () Sie rufen diese Funktion anonyme Funktion Rückkehr function(){alert(33)}
  3. function() { alert("44") return function(){alert(33)} }() () Sie rufen Funktion zurückgegeben, so ist es eigentlich gleichbedeutend mit function(){alert(33)}()

So die gesamte Ausführung entspricht:

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

i nur zu lernen, selbst Aufruf Funktionen auch.
und ich denke, der Code sollte 3. (function() { alert("44"); return function(){alert(33);} })()()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top