JavaScript-Funktionsdeklarations- und Auswertungsreihenfolge
Problem:
Warum kann das folgende JavaScript-Beispiel nicht ausgeführt werden?
<code class="javascript">(function() {
setTimeout(someFunction1, 10);
var someFunction1 = function() { alert('here1'); };
})();</code>
Während andere ähnliche Beispiele wie beabsichtigt funktionieren:
<code class="javascript">(function() {
setTimeout(someFunction2, 10);
function someFunction2() { alert('here2'); }
})();
(function() {
setTimeout(function() { someFunction3(); }, 10);
var someFunction3 = function() { alert('here3'); };
})();
(function() {
setTimeout(function() { someFunction4(); }, 10);
function someFunction4() { alert('here4'); }
})();</code>
Lösung:
Das Problem liegt in der Reihenfolge der Auswertung zwischen Funktionsdeklarationen und Funktionsausdrücke.
Funktionsdeklaration vs. Ausdruck
-
Deklaration: Deklariert eine Funktion mit dem Funktionsschlüsselwort (z. B. Funktion someFunction( ) {}). Funktionsdeklarationen werden während der Kompilierungsphase verarbeitet.
-
Ausdruck: Erstellt eine Funktion mithilfe eines Ausdrucks, der eine Funktion ergibt (z. B. () => {} ). Funktionsausdrücke werden während der Ausführungsphase verarbeitet.
Evaluierungsreihenfolge
JavaScript-Code durchläuft zwei Verarbeitungsphasen:
-
Kompilierung:Variablen werden erstellt und Funktionsdeklarationen verarbeitet.
-
Ausführung:Funktionsausdrücke und anderer Code werden ausgeführt.
Analyse von Beispielen
-
Beispiel 1:
- Die Funktion someFunction1 wird als Funktionsausdruck während der Ausführungsphase.
Die Funktion setTimeout wird aufgerufen, bevor someFunction1 vollständig ausgewertet und der Variablen someFunction1 zugewiesen wird.- Die Funktion setTimeout erhält einen undefinierten Wert für someFunction1 und kann nicht ausgeführt werden.
-
-
Beispiele 2, 3 und 4:
In jedem dieser Beispiele ist die Funktion wird mit dem Funktionsschlüsselwort deklariert und ist somit eine - Funktionsdeklaration.
Funktionsdeklarationen werden während der Kompilierungsphase verarbeitet, sodass sie vorhanden sind, bevor die setTimeout-Funktion aufgerufen wird.- Die setTimeout-Funktion erhält eine gültige Funktionsreferenz und wird erfolgreich ausgeführt.
-
Zusätzliche Klarstellung
Funktionsargumente in JavaScript sind immer als Wert übergeben, was bedeutet, dass die setTimeout-Funktion nicht direkt auf die Variable someFunction1 verweist, sondern vielmehr eine Kopie der Funktion, auf die sie verweist.-
Das obige ist der detaillierte Inhalt vonWarum kann „setTimeout' mit einem Funktionsausdruck, der einer Variablen zugewiesen wurde, bevor diese deklariert wurde, nicht ausgeführt werden, ist aber mit Funktionsdeklarationen erfolgreich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn