Ich bekomme ein merkwürdiges Verhalten, wenn ich ein Objekt mit dem logischen OR deklariere.
%Vor% Wenn ich das var
Schlüsselwort hinzufügen
Warum ist das? Ich kann keine Erklärung finden. my_var
ist globaler Bereich, warum ändert var
also das Verhalten?
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% 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
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.
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:
my_var
existiert. my_var
gefunden wird. 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:
my_var
? Ja, Sie haben es gerade mit dem Schlüsselwort var
erstellt. Obwohl ich die Spezifikationen nicht angeben kann, gehe ich davon aus, dass die Initialisierung in einer var
-Anweisung nur syntaktischer Zucker ist:
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.
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.
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.
Tags und Links javascript