为啥这个变量还活着?
Posted
技术标签:
【中文标题】为啥这个变量还活着?【英文标题】:Why is this variable still alive?为什么这个变量还活着? 【发布时间】:2012-01-10 05:40:30 【问题描述】:我有以下源代码。
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 对对象使用“传递引用”。
请...建议我...
【问题讨论】:
这不是引用传递的意思。instanceOfTestFun = null;
- 这将删除对对象的引用,而不是对象本身。该对象仍被另一个引用 - testObj.pointerToFun
引用 - 因此,不会被垃圾回收。
“我希望看到 'null' ...,但我看到了 testFun 函数” 你知道吗?你不应该看到任何函数。
【参考方案1】:
var x = ;
上面的行创建了一个对象,并在变量x
中存储了一个对它的引用。
var y = x;
以上行将变量x
的引用复制到变量y
。现在,x
和 y
都持有对对象的引用。
x = null;
上面的行删除了存储在x
中的引用。此引用所引用的对象没有被垃圾回收,因为变量y
仍然持有对它的引用。
任何给定的对象只要被至少一个引用引用就可以存活。
【讨论】:
Sime Vidas // 你又来了!!!我记得你在我其他问题中的回答!!总是很有帮助!!!!欣赏!!!【参考方案2】:如果您将保存对它的引用 (instanceOfTestFun
) 的属性设置为 null
,则不会破坏对象本身。您只能通过删除对它的最后一个引用(此时,testObj.pointerToFun
持有的值)间接销毁对象,因此它将被垃圾回收。
在任何情况下都不能删除testObj
的属性而不引用它。
不要将属性(instanceOfTestFun
、testObj
、testObj.pointerToFun
)与它们可以保存的值(对属性的引用,如testObj.pointerToFun = instanceOfTestFun
或普通值,如9
或null
)。
【讨论】:
【参考方案3】:testObj.pointerToFun
和 instanceOfTestFun
是对同一个对象的两个引用。
当您编写 instanceOfTestFun = null
时,您将 instanceOfTestFun
更改为不指向任何内容。
这不会影响testObj.pointerToFun
,它仍然引用原始对象。
如果您更改原始对象(例如,instanceOfTestFun.name = "bye"
),您将通过两个访问器看到更改,因为它们都指向(现在更改的)对象。
【讨论】:
现在更有意义了...我很感激!以上是关于为啥这个变量还活着?的主要内容,如果未能解决你的问题,请参考以下文章
tensorflow变量初始化问题? 如图,在代码中我已经初始化了变量,为啥还提示未初始化变量