【问题标题】: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 函数” 你知道吗?你不应该看到任何函数。

标签: javascript variables object


【解决方案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"),您将通过两个访问器看到更改,因为它们都指向(现在更改的)对象。

    【讨论】:

    • 现在更有意义了...我很感激!
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2012-02-23
    • 2023-03-22
    • 2013-04-26
    • 2016-10-09
    • 1970-01-01
    • 2014-12-05
    • 2021-12-09
    相关资源
    最近更新 更多