为什么这个变量还活着?

问题描述:

我有以下源代码。为什么这个变量还活着?

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

testObj.pointerToFuninstanceOfTestFun是同一个对象的两个引用。

当您编写instanceOfTestFun = null时,您正在更改instanceOfTestFun以指向无。
这并不影响testObj.pointerToFun,它仍然是指原始对象。

如果更改原始对象(例如,instanceOfTestFun.name = "bye"),您将通过两个访问器看到更改,因为它们都指向(现在更改)的对象。

+0

现在它变得更有意义......我很感激它! – Moon

var x = {}; 

上面的代码创建一个对象并将其引用存储在变量x中。

var y = x; 

上面一行拷贝从可变x到可变y参考。现在,xy都保存对该对象的引用。

x = null; 

上述行删除了存储在x中的引用。此引用引用的对象不会被垃圾收集,因为变量y仍然保留对其的引用。

只要至少有一个引用被引用,任何给定的对象都会存在。

+0

Sime Vidas //你再次!我记得你在我的其他问题的答案!总是非常有帮助!!!!!欣赏它! – Moon

如果您设置了一个引用它的属性(instanceOfTestFun)到null,则不会破坏对象本身。你只能通过删除对象的最后一个引用来间接销毁一个对象(在这一点上,它是由testObj.pointerToFun保存的值),所以它将被垃圾收集。

在任何情况下,您不需要引用它就可以删除testObj的属性。

不要混淆了值的属性(instanceOfTestFuntestObjtestObj.pointerToFun),他们可以保存(引用属性,testObj.pointerToFun = instanceOfTestFun后,或纯值,9null)。

+0

Jo So //非常好的观点和建议。欣赏它! – Moon