JavaScript-Variablenbereich und -wert

8
%Vor%

Meine Frage ist, warum die Funktion alert(namepace.blog); return 5 statt 6 wie ich erwarten würde?

    
Russ 16.05.2015, 05:55
quelle

4 Antworten

6

Wichtig dabei ist, dass alle Namen in JavaScript Referenzen auf andere Objekte sind.

Wenn Sie ein Objekt mit Objektliteral erstellen, werden die Namen auf der linken Seite verwendet, um die Objekte zu referenzieren, die bereits durch die Namen auf der rechten Seite bezeichnet sind.

In diesem Fall, wenn Sie

tun %Vor%

Sie sagen blog , um den Wert von loca zu beziehen, was 5. Wenn Sie später loca erhöhen, wird 6 , dh es bezieht sich auf einen anderen Wert, aber blog bezieht sich immer noch auf den Wert 5 .

Deshalb erhalten Sie 5 .

Aber wenn du es tust

%Vor%

Sie erhalten den aktuellen Wert von loca . Da es 6 in getLocal zugewiesen wurde, erhalten Sie 6 .

Inkrementierung erstellt neues Zahlenobjekt

Um es noch deutlicher zu machen, wenn Sie

tun %Vor%

oder

%Vor%

Was intern passiert, ist so etwas

%Vor%

Referenz aus der ECMAScript 5.1-Spezifikation für += und für ++

Da Zahlen unveränderbare Objekte sind (können Sie den Wert von 5 ändern? Sie können das nicht, deshalb wird es ein unveränderliches Objekt genannt), wird ein neues Zahlenobjekt mit einem hinzugefügten Objekt und dem Namen loca erstellt. wird gemacht, um das neue Objekt zu verweisen.

Veränderbare Objekte

Wenn Sie über veränderbare Objekte nachdenken,

%Vor%

Nun beziehen sich sowohl blog als auch loca auf das gleiche Array-Objekt. Was in glob passiert, heißt muting . Sie fügen dem Array-Objekt, das mit den beiden Namen blog und loca bezeichnet wird, nur ein Element hinzu. Deshalb druckt namepace.blog auch [ 1 ] .

    
thefourtheye 16.05.2015 06:04
quelle
1

ist ein logisches Problem. wenn Funktion etwas Zeit braucht. in dieser Zeit Variable zugewiesen .. schauen Sie unter Code. und versuche dies

%Vor%     
Venkatesh TR 16.05.2015 06:08
quelle
1

Es hilft, beim Ausführen eines JavaScript-Programms an den Ausführungskontext zu denken. JavaScript wertet Referenzen aus (nicht direkt Werte).

Der globale Kontext besteht aus globalen Variablen und Objekten. In diesem Fall ist es (zu dem Zeitpunkt, zu dem der JavaScript-Interpreter die Namespace-Anweisung liest):

%Vor%

Das bedeutet, dass der Namespace auf eine Funktion verweist. Bei der ersten Warnung wird der folgende Ausführungskontext für den Namespace erstellt:

%Vor%

Folglich wird die Funktion glob aufgerufen. glob referenziert eine Funktion namens getLocal. Der Ausführungskontext von glob ist wie folgt:

%Vor%

Der nächste Aufruf ist Blog und dieser Blog gibt den Wert 5 zurück. Es verweist nicht auf loca. Es verweist lediglich auf den Wert, den loca beim Erstellen des Ausführungskontexts hatte. Zu dem Zeitpunkt, als der Ausführungskontext erstellt wurde, referenzierte loca einen Wert von 5, und daher verweist blog auf den Wert 5. Egal, wie oft Sie glob aufrufen, der Blog verweist immer noch auf den Wert 5.

In der letzten Warnungsanweisung wird Frosch aufgerufen. frog verweist auf eine anonyme Funktion, die jetzt ausgeführt wird. frosches Ausführungskontext ist wie folgt

%Vor%

Das ist es im Grunde genommen. Versuchen Sie, "Bezug auf einen Wert" zu denken, wenn Sie Wert denken. Dies kann helfen, sich daran zu gewöhnen. Und versuchen Sie, die Ausführungskontexte zu visualisieren, wenn ein Programm ausgeführt wird (wie zum Beispiel ein menschlicher Debugger).

    
Elyasin 16.05.2015 07:31
quelle
0

Wenn Sie namespace.blog zuweisen, verwenden Sie den Übergabewert für den Setter. Dies bedeutet, dass es keinen Verweis auf loca gibt.

Wenn Sie auf den Wert über namespace.frog zugreifen, verwenden Sie die ursprüngliche Variable, die den Abschlussbereich von JavaScript nutzt, um nach loca aufzulösen, der nächsten verfügbaren Definition in der lokalen Bereichskette.

Sie können hier das Scoping nachlesen: Worum geht es? Variablen in JavaScript?

    
Trey Cordova 16.05.2015 06:11
quelle