这个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/     

解决方法

        您可能应该使用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/     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...