此代码是否会造成任何内存泄漏?或者代码有什么问题吗?
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/
答案 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')
存储在函数外部的变量中。