Heim  >  Artikel  >  Web-Frontend  >  Warum schlägt dieser JavaScript-Code fehl, obwohl ähnliche Beispiele funktionieren?

Warum schlägt dieser JavaScript-Code fehl, obwohl ähnliche Beispiele funktionieren?

Linda Hamilton
Linda HamiltonOriginal
2024-10-25 07:59:29461Durchsuche

Why Does This JavaScript Code Fail, Even Though Similar Examples Work?

Deklaration und Auswertung von JavaScript-Funktionen

Hintergrund:

In JavaScript können Funktionen sein mithilfe von Ausdrücken deklariert oder erstellt werden. Funktionsdeklarationen erfolgen während der Kompilierungsphase, während Funktionsausdrücke während der Ausführungsphase ausgewertet werden. Das Verständnis dieser Unterscheidung ist entscheidend für das Verständnis des Verhaltens von JavaScript-Code.

Die Frage:

Warum schlägt das erste Beispiel im folgenden Codeblock fehl, während die übrigen Beispiele erfolgreich ausführen?

<code class="javascript">// 1 - does not work
(function() {
  setTimeout(someFunction1, 10);
  var someFunction1 = function() { alert('here1'); };
})();

// ... other examples</code>

Die Antwort:

Das Scheitern des ersten Beispiels ist nicht auf ein Bereichs- oder Abschlussproblem zurückzuführen, sondern eher auf ein Missverständnis zwischen Deklarationen und Ausdrücken .

Funktionsdeklarationen vs. Ausdrücke:

  • Funktions-Deklarationen folgen der Syntax: Funktionsname (Argumente) {Code}
  • Funktions-Ausdrücke werden als Ausdrücke geschrieben, ähnlich wie Funktionsdeklarationen, aber zur Laufzeit ausgewertet.

Phase 1: Kompilierung

Während der Kompilierung verarbeitet der Compiler Funktionsdeklarationen und erstellt Variablen für die Funktionen. Im ersten Beispiel wird die Variable someFunction1 erstellt, bleibt jedoch undefiniert, da ihr Wert (der Funktionskörper) später ausgewertet wird.

Phase 2: Ausführung

Beispiel 1:

Zur Laufzeit trifft der Interpreter auf setTimeout(someFunction1, 10) und versucht, eine undefinierte someFunction1 an setTimeout zu übergeben.

Beispiel 2:

Im Gegensatz dazu ist die Funktion someFunction2() eine Deklaration, die die Funktion während der Kompilierung erstellt. Wenn setTimeout aufgerufen wird, erhält es die kompilierte Funktionsreferenz.

Beispiel 3:

Hier wird eine anonyme Funktion an setTimeout übergeben, die einen Abschluss für die Variable erstellt someFunction3. Wenn setTimeout ausgelöst wird, wurde someFunction3 ein Wert zugewiesen und die Funktion wird erfolgreich ausgeführt.

Beispiel 4:

Ähnlich wie Beispiel 2 wird die Funktion someFunction4 deklariert, wodurch seine Referenz ist für setTimeout verfügbar.

Zusätzliche Klarstellung:

  • Funktionsargumente werden in JavaScript als Wert für primitive Typen und als Referenz für Objekte übergeben. Dies bedeutet, dass setTimeout keinen Abschluss für someFunction erhält.
  • Das Verständnis der Unterscheidung zwischen Deklarationen und Ausdrücken ist entscheidend für die Vorhersage des Verhaltens von JavaScript-Code.

Das obige ist der detaillierte Inhalt vonWarum schlägt dieser JavaScript-Code fehl, obwohl ähnliche Beispiele funktionieren?. 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