Heim > Web-Frontend > js-Tutorial > Hauptteil

Warum kann „setTimeout' mit einem Funktionsausdruck, der einer Variablen zugewiesen wurde, bevor diese deklariert wurde, nicht ausgeführt werden, ist aber mit Funktionsdeklarationen erfolgreich?

DDD
Freigeben: 2024-10-25 01:56:02
Original
497 Leute haben es durchsucht

Why does `setTimeout` fail to execute with a function expression assigned to a variable before it's declared, but succeeds with function declarations?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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:

  1. Kompilierung:Variablen werden erstellt und Funktionsdeklarationen verarbeitet.
  2. 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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!