var a = a;
ist tatsächlich var a; a = a;
aufgrund des variablen Hebens. Dies bedeutet, dass zum Zeitpunkt der Zuweisung die alte a
bereits durch die neue beschattet wird (was undefined
ist).
Der einfachste Weg, um Probleme wie diese zu vermeiden, ist, den Wert als Parameter zu übergeben:
%Vor% Falls a
eine globale Variable ist, könnten Sie auch var a = window.a;
wie woz vorgeschlagen verwenden - aber seit dem globale Variablen ist in der Regel eine schlechte Idee besser mit den Parametern bleiben.
Die Variable a
in Ihrem Funktionsausdruck Schatten die Variable a
, die im äußeren Bereich deklariert ist.
Es wird NaN
, da in der Zuweisung:
Der rechte a
bezieht sich eigentlich auf den a
im lokalen Bereich.
Variablendeklarationen werden ausgeführt, bevor die Funktion tatsächlich ausgeführt wird. Dies wird allgemein als "Hochziehen" bezeichnet.
Da es sich um dieselbe Variable handelt, enthält sie den Wert undefined
, und wenn Sie versuchen, diesem Wert eine beliebige Zahl hinzuzufügen, wird NaN
:
%code% ist tatsächlich %code% aufgrund des variablen Hebens. Dies bedeutet, dass zum Zeitpunkt der Zuweisung die alte %code% bereits durch die neue beschattet wird (was %code% ist).
Der einfachste Weg, um Probleme wie diese zu vermeiden, ist, den Wert als Parameter zu übergeben:
%Vor%Falls %code% eine globale Variable ist, könnten Sie auch %code% wie woz vorgeschlagen verwenden - aber seit dem globale Variablen ist in der Regel eine schlechte Idee besser mit den Parametern bleiben.
Es gibt eine Variable, die in Javascript hochzieht, also sieht Ihr Code während der Ausführung wie folgt aus:
%Vor%Zuerst haben Sie also die lokale Variable a als undefiniert und ordnen dann undefiniert der Variablen a
zuIn JavaScript ist der aktuelle Ausführungskontext (der Dinge wie den Variablenbereich enthält) eingerichtet vor beginnt Ihr Code mit der Ausführung.
Das bedeutet für Sie, dass Ihre lokalen Variablennamen zuerst zugewiesen werden. Aufgrund von hosting werden Beschriftungen aus %code% -Anweisungen an beliebiger Stelle in der Funktion im aktuellen Ausführungskontext auf undefined initialisiert. ( Funktionsanweisungen werden auch in diesem Schritt initialisiert.)
Als nächstes beginnt Ihr Code tatsächlich mit der Ausführung. Das Label %code% ist bereits im aktuellen Ausführungskontext reserviert, daher weist %code% einfach das lokale %code% (welches undefiniert ist) auf sich selbst zu.
%code% funktioniert, weil Sie das Problem mit dem Geltungsbereich umgehen, indem Sie direkt auf den globalen Bereich zugreifen. Dies funktioniert jedoch nicht in Nicht-Browser-Umgebungen (wie Node), da keine %code% ; Das globale Objekt im Knoten ist %code% .
Wenn ich das tue:
%Vor%Die Ausgabe ist:
%Vor%Warum wird %code% innerhalb der selbstausführenden Funktion %code% ?
Ich weiß, es funktioniert gut, wenn ich das tue:
%Vor%Aber wenn ich den Weg der ersten Version gehe, hat es das %code% Problem.
Warum passiert das?
In JavaScript ist der aktuelle Ausführungskontext (der Dinge wie den Variablenbereich enthält) eingerichtet vor beginnt Ihr Code mit der Ausführung.
Das bedeutet für Sie, dass Ihre lokalen Variablennamen zuerst zugewiesen werden. Aufgrund von hosting werden Beschriftungen aus var
-Anweisungen an beliebiger Stelle in der Funktion im aktuellen Ausführungskontext auf undefined initialisiert. ( Funktionsanweisungen werden auch in diesem Schritt initialisiert.)
Als nächstes beginnt Ihr Code tatsächlich mit der Ausführung. Das Label a
ist bereits im aktuellen Ausführungskontext reserviert, daher weist var a = a;
einfach das lokale a
(welches undefiniert ist) auf sich selbst zu.
var a = window.a
funktioniert, weil Sie das Problem mit dem Geltungsbereich umgehen, indem Sie direkt auf den globalen Bereich zugreifen. Dies funktioniert jedoch nicht in Nicht-Browser-Umgebungen (wie Node), da keine window
; Das globale Objekt im Knoten ist global
.
Tags und Links javascript scope