这个setTimeout是否会造成任何内存泄漏?

时间:2011-05-27 17:53:43

标签: javascript settimeout

此代码是否会造成任何内存泄漏?或者代码有什么问题吗?

HTML:

<div id='info'></div>

使用Javascript:

var count = 0;

function KeepAlive()
{
    count++;

    $('#info').html(count);
    var t=setTimeout(KeepAlive,1000);
}
KeepAlive();

在此处运行测试: http://jsfiddle.net/RjGav/

4 个答案:

答案 0 :(得分:5)

您应该使用setInterval代替:

var count = 0;

function KeepAlive() {
  $('#info').html(++count);
}

var KAinterval = setInterval(KeepAlive, 1000);

如果您需要,可以通过拨打clearInterval(KAinterval);来取消。

答案 1 :(得分:5)

我认为这会泄漏,因为连续的引用永远不会被释放。也就是说,第一个调用通过从内部引用函数立即创建闭包。当它再次调用自身时,新引用来自第一次迭代时创建的实例,因此第一次迭代可能永远不会被释放。

您可以通过将间隔更改为非常小的内容并在Chrome中观察内存来轻松地测试此理论......

(编辑)理论用你的小提琴测试,实际上,我错了它不泄漏,至少在Chrome中。但是,这并不能保证其他浏览器(例如旧的IE)在垃圾收集方面不够好。

但无论是否泄密,都没有理由不使用setInterval

答案 2 :(得分:3)

这不应该造成泄漏,因为KeepAlive函数会及时完成,从而释放该函数中的所有变量。此外,在您当前的代码中,没有理由将t var设置为未使用。如果要使用它取消事件,则应在更高的范围内声明它。

除此之外,我认为你的代码没有“错误”,但这实际上取决于你想要做什么。例如,如果您尝试将其用作精确计时器,则它将比常规时钟慢。因此,您应该考虑在页面加载时设置日期并在需要时计算差异,或者使用setInterval作为g.d.d.c建议。

答案 3 :(得分:2)

提到{g} ..c之类的setInterval方法是很好的 此外,最好将$('#info')存储在函数外部的变量中。

结帐http://jsfiddle.net/RjGav/1/