为什么这个对象不会被垃圾收集?

时间:2014-07-16 05:51:46

标签: javascript garbage-collection

function Car() {
    this.interval = {id: null};
    this.i = 0;
    this.start = function() {
        this.interval.id = setInterval(this.go.bind(this), 1000);
    }

    this.go = function() {
        this.i++;
        if (this.i >= 5) {
            console.log("kill");
            this.kill();
        } else {
            console.log("go");
        }
    };

    this.kill = function() {
        clearInterval(this.interval.id);
    };
}

var car = new Car();
car.start();
car = null;

当我运行以上内容时,我得到了

go
go
go
go
kill

汽车对象不应该被垃圾收集,因为它无法到达? setInterval如何访问汽车对象?之后汽车对象是否继续存在?

2 个答案:

答案 0 :(得分:1)

您创建的car对象仍然可以通过setInterval()所在的闭包来访问。该闭包创建了对car对象的引用,因此它不能被垃圾收集,直到该闭包也无法访问。

创建闭包是因为this.go.bind(this)引用了this这是您的car对象。 JS解释器知道car回调函数仍然可以访问setInterval()对象,因此仍然有实时引用。

如果setInterval()在经过一定次数的迭代或任何其他条件后自行停止,那么该对象将有资格进行垃圾收集,因为setInterval()引用将不再存在,并且没有其他参考仍然活着。

答案 1 :(得分:1)

  this.go.bind(this)

这有效地创建了一个包裹你的汽车的封闭物(this)。

只要关闭是活着的,就会让汽车保持运转。

当然setInterval会记住它应该运行的功能。