2011-12-01 80 views
4

我有以下源代碼。爲什麼這個變量還活着?

testObj = {} 

function testFun() 
{ 
    this.name = "hi"; 
} 

function test() { 

    var instanceOfTestFun = new testFun(); 

    testObj.pointerToFun = instanceOfTestFun; 

    instanceOfTestFun = null; 

    console.log(testObj); 

} 

$(document).ready(test); 

我期望看到 '空' 爲testObj的控制檯輸出,但我看到testFun功能。我認爲JavaScript使用'通過ref'的對象。

...請告訴我...

+1

這不是通過引用意味着什麼。 – SLaks

+2

'instanceOfTestFun = null;' - 這會刪除對象的引用,而不是對象本身。該對象仍由另一個引用 - 「testObj.pointerToFun」引用 - 因此不會被垃圾收集。 –

+0

*「我希望看到'空'...,但我看到testFun函數」*你呢?你不應該看到*任何*功能。 – RightSaidFred

回答

7

testObj.pointerToFuninstanceOfTestFun是同一個對象的兩個引用。

當您編寫instanceOfTestFun = null時,您正在更改instanceOfTestFun以指向無。
這並不影響testObj.pointerToFun,它仍然是指原始對象。

如果更改原始對象(例如,instanceOfTestFun.name = "bye"),您將通過兩個訪問器看到更改,因爲它們都指向(現在更改)的對象。

+0

現在它變得更有意義......我很感激它! – Moon

1
var x = {}; 

上面的代碼創建一個對象並將其引用存儲在變量x中。

var y = x; 

上面一行拷貝從可變x到可變y參考。現在,xy都保存對該對象的引用。

x = null; 

上述行刪除了存儲在x中的引用。此引用引用的對象不會被垃圾收集,因爲變量y仍然保留對其的引用。

只要至少有一個引用被引用,任何給定的對象都會存在。

+0

Sime Vidas //你再次!我記得你在我的其他問題的答案!總是非常有幫助!!!!!欣賞它! – Moon

1

如果您設置了一個引用它的屬性(instanceOfTestFun)到null,則不會破壞對象本身。你只能通過刪除對象的最後一個引用來間接銷燬一個對象(在這一點上,它是由testObj.pointerToFun保存的值),所以它將被垃圾收集。

在任何情況下,您不需要引用它就可以刪除testObj的屬性。

不要混淆了值的屬性(instanceOfTestFuntestObjtestObj.pointerToFun),他們可以保存(引用屬性,testObj.pointerToFun = instanceOfTestFun後,或純值,9null)。

+0

Jo So //非常好的觀點和建議。欣賞它! – Moon