Warum, wenn ich ein Objekt auf eine neue Variable setze, speichert es den Anfangswert der Variablen?

8

Ich habe ein seltsames Verhalten von JavaScript mit übergebenen Variablen als Funktionsparameter gefunden, hier ist das Snippet:

%Vor%

Die Ausgabe ist:

%Vor%

Mit Variable notWorks ist alles klar - Funktion in then () wird aufgerufen, wenn die Variable bereits gelöscht ist. Aber warum, wenn ich dieses Objekt auf eine neue Variable setze, speichert es den Anfangswert der Variablen? Das Objekt wird per Verknüpfung übergeben, oder?

Fiedel mit einem Beispiel: Ссылка

    
Shide93 05.12.2016, 14:26
quelle

3 Antworten

11
  

Mit der Variable notWorks ist alles klar - Funktion in then() wird aufgerufen, wenn die Variable bereits gelöscht ist.

Ja.

  

Aber warum, wenn ich dieses Objekt auf eine neue Variable setze, speichert es den Anfangswert der Variablen? Das Objekt wird per Verknüpfung übergeben, oder?

Diese Zeile:

%Vor%

kopiert die Referenz auf das Objekt von notWorks bis thisWorks . Es gibt zu diesem Zeitpunkt keine laufende Verbindung zwischen den Variablen , sie verweisen beide auf das gleiche Objekt.

Dann starten Sie get und setzen notWorks , um auf ein neues, leeres Objekt zu verweisen. thisWorks bezieht sich immer noch auf das vorherige Objekt. Wenn der get später beendet wird und Sie beide protokollieren, sehen Sie, dass thisWorks immer noch auf das ursprüngliche Objekt zeigt und notWorks immer noch auf das neue, leere Objekt zeigt.

Lasst uns etwas ASCII-Art darauf werfen (okay, technisch ist es Unicode-Art):

Wir beginnen damit:

%Vor%

(Der "Ref11232" ist nur ein Platzhalter für den Wert der Objektreferenz. Wir sehen den Wert einer Objektreferenz nie wirklich, aber Sie können ihn sich als eine Zahl vorstellen, die der JavaScript-Engine mitteilt, wo sich das Objekt befindet Speicher.)

Dann erstellen Sie in why eine neue Variable, thisWorks , über var thisWorks :

%Vor%

Und Sie setzen es auf den gleichen Wert wie notWorks via thisWorks = notWorks :

%Vor%

Nun zeigen beide auf das gleiche Objekt.

Dann starten Sie get , was keinerlei Auswirkungen auf diese Variablen oder Objekte hat.

Dann geben Sie notWorks einen neuen Wert:

%Vor%

Dann warten Sie, bis get abgeschlossen ist, und drucken Sie sie aus.

    
T.J. Crowder 05.12.2016, 14:31
quelle
4

Wenn Sie

tun %Vor%

Sie erstellen ein neues Objekt und weisen es notWorks zu, aber thisWorks ist immer noch der Verweis auf das vorherige Objekt, weshalb die Ausgaben anders sind

    
bugwheels94 05.12.2016 14:31
quelle
0

Weil Sie das Objekt nicht wirklich beeinflussen, wenn die Zeile notWorks = {} ausgeführt wird, entfernen Sie nur den Verweis auf notWorks. thisWorks zeigt immer noch auf das gleiche Objekt im Speicher.

    
Shai 05.12.2016 14:38
quelle

Tags und Links