【发布时间】:2013-08-07 22:32:59
【问题描述】:
我正在查看此演示文稿中的幻灯片:http://slid.es/gruizdevilla/memory
在其中一张幻灯片上,显示此代码的建议是它会造成内存泄漏:
var buggyObject = {
callAgain: function() {
var ref = this;
var val = setTimeout(function() {
ref.callAgain();
}, 1000);
}
}
buggyObject.callAgain();
buggyObject = null;
有人可以在这里更详细地解释这个问题吗?我可能在这里遗漏了一些微妙之处。
【问题讨论】:
-
显然,将永远引用
buggyObject,但我不确定您是否会称其为传统意义上的内存泄漏。它们可能暗示某种循环,因为闭包引用了超时,所以理论上每个调用都会创建一个新的长寿命闭包,除了val是句柄而不是引用。 -
这也让我很困惑。我觉得我错过了一个重要的点,我不确定我是否是。我想他们唯一的一点是非常明显的一点,即您将无限期地运行一段代码,并且它将使用足够的内存来运行它(并在该过程中保持原始的 buggyObject 存活)。但这似乎非常明显。我认为他们试图就将产生的呈指数级增长的泄漏提出一些微妙的观点,但我不知道如何。
-
有人能给出这个代码的固定版本吗?