gpt4 book ai didi

javascript - 为什么这个对象没有被垃圾回收?

转载 作者:行者123 更新时间:2023-12-02 17:11:35 24 4
gpt4 key购买 nike

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 如何访问 car 对象?那么汽车对象之后还会继续存在吗?

最佳答案

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

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

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

关于javascript - 为什么这个对象没有被垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24773126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com