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如何访问汽车对象?之后汽车对象是否继续存在?
答案 0 :(得分:1)
您创建的car
对象仍然可以通过setInterval()
所在的闭包来访问。该闭包创建了对car
对象的引用,因此它不能被垃圾收集,直到该闭包也无法访问。
创建闭包是因为this.go.bind(this)
引用了this
这是您的car
对象。 JS解释器知道car
回调函数仍然可以访问setInterval()
对象,因此仍然有实时引用。
如果setInterval()
在经过一定次数的迭代或任何其他条件后自行停止,那么该对象将有资格进行垃圾收集,因为setInterval()
引用将不再存在,并且没有其他参考仍然活着。
答案 1 :(得分:1)
this.go.bind(this)
这有效地创建了一个包裹你的汽车的封闭物(this
)。
只要关闭是活着的,就会让汽车保持运转。
当然setInterval
会记住它应该运行的功能。