2012-06-08 11 views
9

Stimmt es, dass in JavaScript-Funktionen andere Objekte als Boolean und Numbers als Referenz zurückgegeben werden?Rückgabe per Referenz in JavaScript?

Wie ist das möglich, wenn diese Objekte zerstört werden, wenn die Funktion, zu der sie gehören, beendet wird?

+0

Javascript ist nicht C. – doug65536

Antwort

17

Objekte werden nicht zerstört bis alle Referenzen zu ihnen sind weg und Müll gesammelt. Wenn das Objekt zurückgegeben wird, erhält der aufrufende Code einen Verweis darauf, und das Objekt wird nicht mit Garbage Collection gesammelt.

Technisch wird der Stack-Frame der aufgerufenen Funktion bei der Rückkehr zerstört. Das Objekt befindet sich jedoch nicht auf dem Stapel, sondern auf dem Heap. Der lokale Verweis der Funktion auf das Objekt befindet sich auf dem Stapel und wird daher zerstört, aber die Referenz des aufrufenden Codes wird erst einige Zeit später zerstört.

Als eine Randnotiz ist es nicht wirklich wichtig, wie es zurückgegeben wird, da die Funktion das Objekt sowieso nicht verwenden kann, nachdem es zurückkehrt.

+0

Der Aktivierungsdatensatz selbst kann persistieren, wenn die Funktion zurückkehrt, wenn die Funktion ihren äußeren Gültigkeitsbereich so beeinflusst, dass ein Verweis darauf verfügbar gemacht wird. Das heißt, wenn eine Funktion eine Funktion instanziiert und diese Funktion den lokalen Gültigkeitsbereich referenziert (den Aktivierungsdatensatz oder "Stapelrahmen" - was er wirklich nicht ist), und diese Funktion wird zurückgegeben oder einer relativ globalen Variablen zugewiesen oder Eigenschaft, dann bleibt der Aktivierungsdatensatz verfügbar und wird nicht gesammelt. – Pointy

8

Stimmt es, dass in JavaScript-Funktionen andere Objekte als Boolean und Numbers als Referenz zurückgegeben werden?

Es ist wahr, Objekte in JavaScript sind immer als Referenz übergeben

Wie es möglich ist, wenn diese Objekte zerstört werden, wenn die Funktion beendet diejenigen gehören?

Nur Referenzen werden zerstört, nicht die Werte selbst. Und solange keine Referenzen mehr vorhanden sind, ist das Objekt ein Kandidat für die Müllsammlung.

6

Zwei große Antworten gibt, aber dachte nur, sollte ich hinzufügen, dass es zu Test leicht genug ist:

function modify(arg) { 
    arg.modified = true; 
} 
test = 4; 
modify(test); 
console.log(test.modified); // undefined 
test = {}; 
modify(test); 
console.log(test.modified); // true 
test = ""; 
modify(test); 
console.log(test.modified); // undefined 

wo nicht definiert bedeutet es statt als Referenz übergeben kopiert wurde zu werden. Beachten Sie, dass Zeichenfolgen auch nicht als Referenz übergeben werden.

2

Argumente (einschließlich Objekte) werden per Wert an eine Funktion gesendet. Eigenschaften eines Argumentobjekts sind verfügbar und änderbar, das verhält sich wie Referenzen. Schauen Sie sich das Beispiel unten:

function changeObj(obj){obj.a *= 10; return true;} 
function killObj(obj){obj = null; return true;} 
function changeAndKillObj(obj){obj.a += 1; obj = null; return true;} 
var a = {a:1, b:'test'}; 
console.log(a); //Object {a:1, b:'test'} 
changeObj(a); 
console.log(a); //Object {a:10, b:'test'} 
killObj(a); 
console.log(a); //Object {a:10, b:'test'} 
changeAndKillObj(a); //Object {a:11, b:'test'} 

Fazit: Sie können tun, was Sie mit Objekteigenschaften wollen aber nicht mit dem Objekt selbst. Jede Zuweisung zu dem Argument führt zu einem anderen Objekt und zum Aufheben der Verknüpfung vom ursprünglichen Objekt.