Javascript 为什么这个变量仍然存在?
我有以下源代码Javascript 为什么这个变量仍然存在?,javascript,variables,object,Javascript,Variables,Object,我有以下源代码 testObj = {} function testFun() { this.name = "hi"; } function test () { var instanceOfTestFun = new testFun(); testObj.pointerToFun = instanceOfTestFun; instanceOfTestFun = null; console.log(testObj); } $(docum
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对对象使用“passbyref”
请…告诉我…
testObj。指针tofun
和instanceOfTestFun
是对同一对象的两个引用
当您写入
instanceOfTestFun=null
时,您正在将instanceOfTestFun
更改为不指向任何内容。这不会影响仍然引用原始对象的
testObj.pointerToFun
如果更改原始对象(例如,instanceOfTestFun.name=“bye”
),您将通过两个访问器看到更改,因为它们都指向(现在已更改)对象
上行将创建一个对象,并在变量x
中存储对该对象的引用
var y = x;
上行将引用从变量x
复制到变量y
。现在,x
和y
都保存对对象的引用
x = null;
上行将删除存储在x
中的引用。此引用引用的对象未被垃圾收集,因为变量y
仍保留对它的引用
任何给定的对象只要被至少一个引用引用就可以生存。如果将包含对其引用的属性(
instanceOfTestFun
)设置为null
,则不会破坏对象本身。您只能通过删除对对象的最后一个引用(即此时由testObj.pointerToFun
持有的值)来间接销毁对象,因此它将被垃圾收集
在任何情况下,您都不能删除testObj
的属性而不引用它
不要将属性(
instanceOfTestFun
,testObj
,testObj.pointerToFun
)与它们可以保存的值混淆(引用属性,如testObj.pointerToFun=instanceOfTestFun
,或普通值,如9
或null
).这不是引用传递的意思。instanceOfTestFun=null代码>-这将删除对对象的引用,而不是对象本身。该对象仍然被另一个引用引用-testObj.pointerToFun
,因此不会被垃圾收集。“我希望看到‘null’…,但我看到了testFun函数”是吗?你不应该看到任何功能。它现在更有意义了…我很感激!西蒙·维达斯//又是你!!!我记得你在我其他问题中的回答!!总是很有帮助!!!!!谢谢你!!!
x = null;