为什么这个变量还活着?
我有以下源代码。为什么这个变量还活着?
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'的对象。
...请告诉我...
testObj.pointerToFun
和instanceOfTestFun
是同一个对象的两个引用。
当您编写instanceOfTestFun = null
时,您正在更改instanceOfTestFun
以指向无。
这并不影响testObj.pointerToFun
,它仍然是指原始对象。
如果更改原始对象(例如,instanceOfTestFun.name = "bye"
),您将通过两个访问器看到更改,因为它们都指向(现在更改)的对象。
现在它变得更有意义......我很感激它! – Moon
var x = {};
上面的代码创建一个对象并将其引用存储在变量x
中。
var y = x;
上面一行拷贝从可变x
到可变y
参考。现在,x
和y
都保存对该对象的引用。
x = null;
上述行删除了存储在x
中的引用。此引用引用的对象不会被垃圾收集,因为变量y
仍然保留对其的引用。
只要至少有一个引用被引用,任何给定的对象都会存在。
Sime Vidas //你再次!我记得你在我的其他问题的答案!总是非常有帮助!!!!!欣赏它! – Moon
如果您设置了一个引用它的属性(instanceOfTestFun
)到null
,则不会破坏对象本身。你只能通过删除对象的最后一个引用来间接销毁一个对象(在这一点上,它是由testObj.pointerToFun
保存的值),所以它将被垃圾收集。
在任何情况下,您不需要引用它就可以删除testObj
的属性。
不要混淆了值的属性(instanceOfTestFun
,testObj
,testObj.pointerToFun
),他们可以保存(引用属性,testObj.pointerToFun = instanceOfTestFun
后,或纯值,9
或null
)。
Jo So //非常好的观点和建议。欣赏它! – Moon
这不是通过引用意味着什么。 – SLaks
'instanceOfTestFun = null;' - 这会删除对象的引用,而不是对象本身。该对象仍由另一个引用 - “testObj.pointerToFun”引用 - 因此不会被垃圾收集。 –
*“我希望看到'空'...,但我看到testFun函数”*你呢?你不应该看到*任何*功能。 – RightSaidFred