问题描述
|
此代码是否会造成任何内存泄漏?还是代码有什么问题?
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/
解决方法
您可能应该使用setInterval代替:
var count = 0;
function KeepAlive() {
$(\'#info\').html(++count);
}
var KAinterval = setInterval(KeepAlive,1000);
如果需要,可以通过致电clearInterval(KAinterval);
取消它。
, 我认为这会泄漏,因为以后的引用永远不会释放。也就是说,第一个调用通过从自身内部引用该函数立即创建一个关闭。当它再次调用自身时,新引用来自第一次迭代中创建的实例,因此永远不会释放第一个引用。
您可以通过将间隔更改为很小的值并观察chrome中的内存来非常容易地测试该理论。
(编辑)理论用您的小提琴进行了测试,实际上,我错了,至少在Chrome中它没有泄漏。但这不能保证某些其他浏览器(例如较旧的IE)在垃圾收集方面的表现也不佳。
但是,不管它是否泄漏,没有理由不使用setInterval
。
, 这不会造成泄漏,因为KeepAlive
函数将及时完成,因此会释放该函数中的所有变量。另外,在您当前的代码中,没有理由设置t
var,因为它未被使用。如果要使用它来取消事件,则应在更高范围内声明它。
除此之外,您的代码看不到任何“错误”,但这实际上取决于您要执行的操作。例如,如果您尝试将其用作精确计时器,则它将比常规时钟慢。因此,您应该考虑在页面加载时设置日期并在需要时计算差异,或者按照建议的g.d.d.c使用setInterval
。
, 最好有提到的g.d.d.c之类的setInterval
方法。
此外,最好将“ 9”存储在函数外部的变量中。
结帐http://jsfiddle.net/RjGav/1/