我有以下源代码。
testObj = {}
function testFun()
{
this.name = "hi";
}
function test () {
var instanceOfTestFun = new testFun();
testObj.pointerToFun = instanceOfTestFun;
instanceOfTestFun = null;
console.log(testObj);
}
$(document).ready(test);
我希望 testObj 的控制台输出看到'null',但我看到 testFun 功能。我认为javascript使用'pass by ref'来表示对象。
请......告诉我......
答案 0 :(得分:7)
testObj.pointerToFun
和instanceOfTestFun
是对同一对象的两个引用。
当您撰写instanceOfTestFun = null
时,您正在将instanceOfTestFun
更改为指向任何内容
这不会影响testObj.pointerToFun
,它仍然引用原始对象。
如果更改原始对象(例如instanceOfTestFun.name = "bye"
),您将看到两个访问者的更改,因为它们都指向(现在更改的)对象。
答案 1 :(得分:1)
var x = {};
上面的行创建了一个对象,并在变量x
内存储了对它的引用。
var y = x;
以上行将变量x
的引用复制到变量y
。现在,x
和y
都持有对象的引用。
x = null;
以上行删除存储在x
内的引用。此引用引用的对象不是垃圾回收的,因为变量y
仍然保存对它的引用。
任何给定的对象都会存在,只要它被至少一个引用引用。
答案 2 :(得分:1)
如果您将一个包含对它的引用(instanceOfTestFun
)的属性设置为null
,则不会销毁该对象本身。你只能通过删除对象的最后一个引用来间接销毁一个对象(也就是那时testObj.pointerToFun
所持有的值),因此它将被垃圾收集。
在任何情况下都不能删除testObj
的属性而不引用它。
不要将属性(instanceOfTestFun
,testObj
,testObj.pointerToFun
)与它们可以容纳的值混淆(对属性的引用,如testObj.pointerToFun = instanceOfTestFun
之后的值,或普通值,作为9
或null
)。