【发布时间】:2012-02-09 04:07:03
【问题描述】:
考虑以下代码(您可以将其放在 Chrome 的开发者控制台中并检查)。
var obj = {
f: function () {
var myRef = this;
val = setTimeout(function () {
console.log("time down!");
myRef.f();
}, 1000);
}
};
如果我再跑
obj.f();
要启动计时器,我可以看到每一秒“时间到了!”
如果我再跑
obj = null;
计时器仍在触发。
只是好奇为什么垃圾回收不清除计时器?可怕的是,似乎现在无法删除计时器 - 我说的对吗?
我的猜测是,从技术上讲,window 仍然持有对该对象的引用,因此该对象仍保留在内存中。我在另一种基于 ECMA 的语言(Actionscript)中遇到过这个问题,并构建了一个库来处理它,但我认为 Javascript 会采用不同的方法。
【问题讨论】:
-
可能值得查看以下答案:stackoverflow.com/questions/858619/… 似乎没有办法像这样完成计时器!
-
这并不是一个需要特殊处理的问题——这是设计使然。如果您打算在用户离开页面之前停止计时器,请保存来自
setTimeout的返回值而不是将其丢弃,这样您就可以使用clearTimeout来停止它。 -
你不会碰巧在实际代码中使用任何看起来像这样的东西吗?内联函数声明、容器对象以及从一个作用域泄漏到另一个作用域的整个组合,这一切都使得代码很难阅读。在某些情况下,稍微打包可以解决一些问题,但这似乎不是其中之一。
-
@eBusiness 当然我不会,但是考虑一些使用自己的“计时器”的库......然后考虑有多少其他编码人员在做 $("div").html("")将其“清除”而不是使用某些图表的“销毁”方法。那些计时器可能不会被破坏......我希望可以将 setTimer 放在 div 上......然后如果 div 被清除,计时器也会被清除......可能会导致应用程序中的内存泄漏更少
标签: javascript garbage-collection settimeout