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 ]
.
ist ein logisches Problem. wenn Funktion etwas Zeit braucht. in dieser Zeit Variable zugewiesen .. schauen Sie unter Code. und versuche dies
%Vor%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).
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?
Tags und Links javascript namespaces scope function