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: Ссылка
Mit der Variable
notWorks
ist alles klar - Funktion inthen()
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
:
Und Sie setzen es auf den gleichen Wert wie notWorks
via thisWorks = notWorks
:
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:
Dann warten Sie, bis get
abgeschlossen ist, und drucken Sie sie aus.
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
Tags und Links javascript