为什么这个变量还活着?

时间:2011-12-01 00:48:20

标签: javascript variables object

我有以下源代码。

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'来表示对象。

请......告诉我......

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

var x = {};

上面的行创建了一个对象,并在变量x内存储了对它的引用。

var y = x;

以上行将变量x的引用复制到变量y。现在,xy都持有对象的引用。

x = null;

以上行删除存储在x内的引用。此引用引用的对象不是垃圾回收的,因为变量y仍然保存对它的引用。

任何给定的对象都会存在,只要它被至少一个引用引用。

答案 2 :(得分:1)

如果您将一个包含对它的引用(instanceOfTestFun)的属性设置为null,则不会销毁该对象本身。你只能通过删除对象的最后一个引用来间接销毁一个对象(也就是那时testObj.pointerToFun所持有的值),因此它将被垃圾收集。

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

不要将属性(instanceOfTestFuntestObjtestObj.pointerToFun)与它们可以容纳的值混淆(对属性的引用,如testObj.pointerToFun = instanceOfTestFun之后的值,或普通值,作为9null)。