【问题标题】:Why does this object not get garbage collected?为什么这个对象没有被垃圾收集?
【发布时间】:2014-07-16 05:51:46
【问题描述】:
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 如何能够访问汽车对象?之后汽车对象还会继续存在吗?

【问题讨论】:

    标签: javascript garbage-collection


    【解决方案1】:

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

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

    如果setInterval() 在经过一定次数的迭代或任何其他条件后自行停止,则该对象将有资格进行垃圾回收,因为该setInterval() 引用将不再活动并且不会有其他引用还活着。

    【讨论】:

      【解决方案2】:
        this.go.bind(this)
      

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

      只要该关闭还活着,它就会让汽车保持原状。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        • 1970-01-01
        • 2010-11-10
        • 2011-06-14
        相关资源
        最近更新 更多