Variable ohne var-Schlüsselwort und logisches ODER deklarieren

8

Ich bekomme ein merkwürdiges Verhalten, wenn ich ein Objekt mit dem logischen OR deklariere.

%Vor%

Wenn ich das var Schlüsselwort hinzufügen

%Vor%

Warum ist das? Ich kann keine Erklärung finden. my_var ist globaler Bereich, warum ändert var also das Verhalten?

    
John Giotta 10.08.2011, 15:09
quelle

7 Antworten

5

Das erste Beispiel versucht, einer Eigenschaft des globalen Objekts my_var eine Eigenschaft zuzuweisen, indem es den Wert einer Kennung mit dem Namen my_var (ODER ein leeres Objekt) liest. Der Bezeichner my_var ist jedoch zu diesem Zeitpunkt nicht definiert, daher schlägt er fehl.

Im zweiten Beispiel wird die Variable my_var aufgrund der Funktionsweise des Hubs von JavaScript-Variablen bereits deklariert, wenn Sie davon lesen, indem Sie sie zuweisen.

Sehen Sie sich auch dieses Beispiel an:

%Vor%

Mit var keyword wird es funktionieren!

%Vor%

Dies liegt daran, dass das variable Hochheben es in folgendes umwandelt:

%Vor%     
Daniel Baulig 10.08.2011, 15:16
quelle
1

Wenn Sie eine Variable ohne var definieren, greifen Sie direkt auf global object zu. Das bedeutet, dass Ihre JavaScript-Engine versucht, my_var auf dem globalen Objekt nachzuschlagen ( window , wenn Sie sich in einem Browser befinden). Da diese Eigenschaft noch nicht existiert, wird Ihre JS-Engine ausgelöst.

Das passiert auf der rechten Seite Ihrer Anweisung, wenn Ihre Engine versucht, eine Variable mit dem Namen my_var zu lesen. Zuweisen wie

%Vor%

würde funktionieren. Der Zugriff auf einen Bezeichner ohne var führt jedoch dazu, dass der Browser die Scopechain nachschlägt. Da das variable object für das globale Objekt das globale Objekt selbst ist, endet die Suchprozedur nirgendwo (= Ausnahme).

Wenn Sie das Schlüsselwort var infront eingeben, weiß Ihre js-Engine bei der Parstime, dass sie eine neue Variable mit diesem Bezeichnernamen deklarieren muss. Tatsächlich deklariert sie diese Variable mit einem undefined -Wert (das heißt "hissen"). Das heißt, die Verwendung von var erstellt vorzeitig eine Eigenschaft in current context mit diesem Namen. Wenn sich dieser Code also nicht in einem Funktions- oder Evaluierungskontext befindet, wird die Eigenschaft my_var für das window -Objekt erstellt.

    
jAndy 10.08.2011 15:20
quelle
1

In Ihrem zweiten Beispiel definiert var den Umfang von my_var . Dadurch kann der Wert richtig eingestellt werden. Hier ist ein kurzer und dreckiger Blick auf das, was in beiden Beispielen passiert:

In Beispiel 1 muss die JS-Engine Folgendes tun:

  1. Überprüfen Sie den aktuellen Bereich, um zu sehen, ob my_var existiert.
  2. Überprüfen Sie den obigen Bereich (und den darüber liegenden Bereich), bis my_var gefunden wird.
  3. Erzeuge my_var im globalen Bereich, wenn er nicht gefunden wird. *

* Schritt 3 ist noch nicht geschehen, wenn Sie versuchen, my_var einen Wert zuzuordnen.

Beispiel 2:

  1. Gibt es im aktuellen Bereich eine Variable namens my_var ? Ja, Sie haben es gerade mit dem Schlüsselwort var erstellt.
  2. Weisen Sie den Wert zu.
James Hill 10.08.2011 15:14
quelle
0

In der zweiten Situation ist meine Variable undefiniert, daher wird der Variablen ein leeres Objekt zugewiesen, das {}

ist     
Trevor 10.08.2011 15:13
quelle
0

Obwohl ich die Spezifikationen nicht angeben kann, gehe ich davon aus, dass die Initialisierung in einer var -Anweisung nur syntaktischer Zucker ist:

%Vor%

entspricht:

%Vor%

In der ersten Zeile wird my_var deklariert und implizit auf den speziellen Wert undefined gesetzt. Dann existiert in der zweiten Zeile my_var , undefined ergibt false und es wird kein Fehler ausgelöst.

In Ihrem ersten Beispiel ist my_var jedoch unbekannt, wenn die rechte Seite ausgewertet wird, daher der Fehler.

    
Ferdinand Beyer 10.08.2011 15:19
quelle
0

Im ersten Fall versuchen Sie, eine Variable zuzuweisen, die nicht definiert wurde. Es ist das gleiche wie Sie schreiben würden:

%Vor%

im zweiten Fall my_var ist nur undefiniert, da Sie das var-Schlüsselwort und create my_var im tatsächlichen Bereich verwenden. Undefined wird in false konvertiert und das leere Objekt wird zurückgegeben.

    
Andreas Köberle 10.08.2011 15:23
quelle
0

Interessanterweise funktioniert das :

%Vor%

Wenn Sie das Schlüsselwort 'var' verwenden, geben Sie buchstäblich den Befehl "Erstellen Sie eine neue Variable und weisen Sie ihr diesen Wert zu". Wenn Sie nicht 'var' verwenden, dann implizieren Sie, dass die Variable bereits irgendwo im globalen Gültigkeitsbereich existiert.

In Ihrem Beispiel versucht die JavaScript-Engine, den aktuellen Wert von 'my_var' zu suchen, stellt fest, dass sie nicht existiert, kann sie nicht erstellen, weil Sie gerade versuchen, ihr einen Wert zuzuweisen, und schlägt fehl.

    
ninjascript 10.08.2011 15:27
quelle

Tags und Links