Problem mit lokalem JavaScript-Scoping

8

Wenn ich das tue:

%Vor%

Die Ausgabe ist:

%Vor%

Warum wird a innerhalb der selbstausführenden Funktion NaN ?

Ich weiß, es funktioniert gut, wenn ich das tue:

%Vor%

Aber wenn ich den Weg der ersten Version gehe, hat es das NaN Problem.

Warum passiert das?

    
Neal 12.07.2012, 17:28
quelle

4 Antworten

10

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.

    
ThiefMaster 12.07.2012, 17:35
quelle
5
___ qstnhdr ___ Problem mit lokalem JavaScript-Scoping ___ answer11457447 ​​___

Die Variable a in Ihrem Funktionsausdruck Schatten die Variable a , die im äußeren Bereich deklariert ist.

Es wird NaN , da in der Zuweisung:

%Vor%

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 :

%Vor%     
___ answer11457424 ___

%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.

    
___ tag123scope ___ Scope ist ein einschließender Kontext, in dem Werte und Ausdrücke verknüpft sind. Verwenden Sie dieses Tag für Fragen zu verschiedenen Arten von Bereichen sowie für Fragen, deren Umfang unklar sein könnte. ___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___ answer11457428 ___

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

zu     
___ answer11457466 ___

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 %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% .

    
___ qstntxt ___

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?

    
___
CMS 12.07.2012 17:36
quelle
2

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 .

    
josh3736 12.07.2012 17:38
quelle
0

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

zu     
jagm 12.07.2012 17:35
quelle

Tags und Links