Heim > Artikel > Web-Frontend > Warum schlägt mein JavaScript-Code fehl, wenn ich „setTimeout' mit Funktionsausdrücken verwende?
In JavaScript umfasst die Codeausführung zwei Phasen: Kompilierung und Auswertung. Das erste Beispiel scheitert an einem grundlegenden Missverständnis zwischen Funktionsdeklarationen und Ausdrücken in Bezug auf diese Phasen.
Funktionsdeklarationen verwenden Sie das Schlüsselwort function und folgen Sie dem Syntax:
function name (arguments) {code}
Funktionsausdrücke hingegen werden im Ausdruckskontext geschrieben und folgen der gleichen Syntax wie Deklarationen, außer dass sie in Klammern eingeschlossen sind. Ausdrücke werden während der Ausführung verarbeitet, nicht bei der Kompilierung.
Beispiel 1:
(function() { setTimeout(someFunction1, 10); var someFunction1 = function() { alert('here1'); }; })();
Kompilierung: SomeFunction1 ist als undefiniert definiert.
Ausführung: setTimeout wird mit dem undefinierten Wert von someFunction1 aufgerufen.
Beispiel 2:
(function() { setTimeout(someFunction2, 10); function someFunction2() { alert('here2'); } })();
Kompilierung: SomeFunction2 wird als Funktion deklariert..
Ausführung: setTimeout wird mit der kompilierten someFunction2-Funktion aufgerufen.
Beispiel 3:
(function() { setTimeout(function() { someFunction3(); }, 10); var someFunction3 = function() { alert('here3'); }; })();
Kompilierung: SomeFunction3 ist zunächst als undefiniert definiert.
Ausführung: Eine anonyme Funktion wird übergeben zu setTimeout, wodurch ein Abschluss für someFunction3 erstellt wird. Später wird someFunction3 eine Funktion zugewiesen, die ihren undefinierten Wert überschreibt.
Beispiel 4:
(function() { setTimeout(function() { someFunction4(); }, 10); function someFunction4() { alert('here4'); } })();
Ähnlich wie Beispiel 2 wird someFunction4 deklariert, bevor es an übergeben wird setTimeout.
Das erste Beispiel schlägt fehl, weil someFunction1 nicht deklariert wird, bevor es während der Kompilierung an setTimeout übergeben wird. Funktionsausdrücke müssen während der Ausführung ausgewertet werden, nachdem Deklarationen verarbeitet wurden. Daher ist die Reihenfolge der Ausdrücke bei der Verwendung von Funktionsausdrücken entscheidend, insbesondere bei der Übergabe an asynchrone Funktionen wie setTimeout.
Das obige ist der detaillierte Inhalt vonWarum schlägt mein JavaScript-Code fehl, wenn ich „setTimeout' mit Funktionsausdrücken verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!