为啥这个变量还活着?

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。现在,xy 都持有对对象的引用。

x = null;

上面的行删除了存储在x 中的引用。此引用所引用的对象没有被垃圾回收,因为变量y 仍然持有对它的引用。

任何给定的对象只要被至少一个引用引用就可以存活。

【讨论】:

Sime Vidas // 你又来了!!!我记得你在我其他问题中的回答!!总是很有帮助!!!!欣赏!!!【参考方案2】:

如果您将保存对它的引用 (instanceOfTestFun) 的属性设置为 null,则不会破坏对象本身。您只能通过删除对它的最后一个引用(此时,testObj.pointerToFun 持有的值)间接销毁对象,因此它将被垃圾回收。

在任何情况下都不能删除testObj 的属性而不引用它。

不要将属性(instanceOfTestFuntestObjtestObj.pointerToFun)与它们可以保存的值(对属性的引用,如testObj.pointerToFun = instanceOfTestFun 或普通值,如9null )。

【讨论】:

【参考方案3】:

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

当您编写 instanceOfTestFun = null 时,您将 instanceOfTestFun 更改为不指向任何内容。 这不会影响testObj.pointerToFun,它仍然引用原始对象。

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

【讨论】:

现在更有意义了...我很感激!

以上是关于为啥这个变量还活着?的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow变量初始化问题? 如图,在代码中我已经初始化了变量,为啥还提示未初始化变量

java环境变量配置完了javac为啥不对呢

为啥tomcat中的web应用停了,线程还在跑

python调用其他py文件的变量,为啥总会把这个调用的py文件先运行一遍。。

重新安装的Qgis为啥还存在和原来一样的问题

为啥我不能继承这个变量?