2017-08-29 1 views
0

Wie könnte dieses Verhalten erklärt werden? Warum druckt es {a: 10}?Globale Objekteigenschaftsmodifikation funktioniert von Funktion, kann Objekt selbst aber nicht neu definieren

var a = {}; 

(function b (a) { 
    a.a = 10; 
    a = null; 
})(a); 

console.log(a); // { a: 10 } 
+0

Es wird nicht '10' gedruckt, es wird' {a: 10} 'genauso gedruckt, wie Sie es in der Funktion definiert haben. Oh, du meinst die 'null'-Zuweisung ... – evolutionxbox

+0

Ändere die lokale Variable 'a' in etwas anderes und dann wird es wie erwartet funktionieren. – evolutionxbox

+1

zwei Referenzen zeigen in das gleiche Objekt. Wenn Sie eine Eigenschaft hinzufügen, wirkt sich dies auf beide Referenzen aus, aber wenn Sie eine davon auf Null setzen, ändern Sie tatsächlich die Referenz, nicht das Objekt. Über die Originalreferenz, die auf das Objekt zeigt, wird 10 –

Antwort

1

In JS erwartet, Objekte als Referenz übergeben werden. Wenn Sie also ()(a) tun, übergeben Sie die Referenz a, um als Argument zu fungieren.

Nun wird diese Referenz in einer lokalen Variablen als Argument gespeichert. Wenn Sie also die Variable aktualisieren, überschreiben Sie im Wesentlichen das Objekt an dieser Position.

Der Trick ist, wenn Sie die Referenz ersetzen. a=null aktualisiert die Referenz in der Argumentvariablen a, überschreibt jedoch nicht das Objekt in der Referenz. Das ursprüngliche Objekt ist also immer noch verfügbar, nur nicht referenziert.

Nach IIFE, wenn Sie sich erneut anmelden, da der Umfang der Argumentvariablen vorbei ist, wird es zerstört, und a wieder zeigt auf original a.

Daher werden Sie {a: 10}

1

Innerhalb der Funktion a bezieht sich auf die lokale Variable in die Funktion übergeben. Da Sie den gleichen Namen gewählt hat, ist es verwirrend, aber das sehen:

var a = {}; 
 

 
(function b (c) { 
 
    console.log('1. c = ', c); 
 
    console.log('2. a = ', a); 
 
    c.a = 10; 
 
    console.log('3. c = ', c); 
 
    console.log('4. a = ', a); 
 
    a = null; 
 
})(a); 
 

 
console.log('5. a = ', a);

Es gibt null zurück als

+0

gedruckt. Sie können auch vor und nach der Zuweisung sowohl "a" als auch "c" protokollieren. – Bergi

1

Die a in Ihrer Funktion bekommen, ist eine andere Variable als der globale a. Sie übergeben den Wert der globalen Variablenin Ihrer Funktion, die eine lokale Variable erzeugt. Die Tatsache, dass Sie diese lokale Variable a benannt haben, bedeutet nur, dass sie die globale Variable mit dem gleichen Namen schattiert.

Es sind also zwei verschiedene Variablen, aber ihre Werte sind beide Referenzen auf das von Ihnen erstellte Objekt. Innerhalb Ihrer Funktion schreiben Sie in eine Eigenschaft dieses Objekts. Dann weisen Sie der lokalen Variablen anull zu. Dies entfernt nur diese bestimmte Referenz auf das Objekt, aber das Objekt existiert immer noch und die globale Variable bezieht sich immer noch darauf. Wenn Sie also diese globale Variable console.log() drucken, wird das Objekt gedruckt.

Verwandte Themen