2011-05-27 53 views
2

此代码是否创建任何内存泄漏?或者代码有什么问题?这个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/

+0

我不确定如果以您描述的方式使用'setTimeout'会导致内存泄漏。如果你想单独测试内存泄漏,你可以尝试一些东西 - 但是如果你选择尝试,请记住不同的浏览器由于不同的原因以不同的方式泄漏。 – DavidJCobb 2011-05-27 18:05:07

回答

5

你应该使用的setInterval来代替:

var count = 0; 

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

var KAinterval = setInterval(KeepAlive, 1000); 

如果您需要致电clearInterval(KAinterval);,您可以取消它。

+0

感谢g.d.d.c +1 ...有什么理由不在KAinterval前面使用var?就是想。 – capdragon 2011-05-27 18:18:11

+0

@capdragon - 一个错字。接得好。 – 2011-05-27 18:42:37

5

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

你可以通过改变间隔为非常小的测试这个理论很容易地和观看铬内存...

(编辑),理论与小提琴测试,其实,我错了,它不”至少在Chrome中是不漏的。但这并不能保证其他一些浏览器(例如较老的IE)不擅长垃圾收集。

但是否泄漏,没有理由不使用setInterval代替。

2

很高兴有setInterval方法如g.d.d.c提到过。
此外,最好将$('#info')存储在函数外的变量中。

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

+0

谢谢,请您详细说明为什么在函数外部存储变量更好...您发布的jsfiddle链接也不会运行。 – capdragon 2011-05-27 18:09:54

+1

更正了代码:http:// jsfiddle。net/RjGav/2/ – 2011-05-27 18:10:52

+3

$('#info')'每次运行时都会运行,这是不需要的,因为从它返回的值永远不会改变。通过将此调用移到该函数之外,可以避免这种不必要的计算。 – 2011-05-27 18:13:42

3

这不应该创建一个泄漏,因为KeepAlive功能将及时完成,从而释放该函数的所有变量。此外,在您当前的代码中,没有任何理由设置t var,因为它未被使用。如果你想用它来取消你的事件,你应该在更高的范围内声明它。

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

+0

非常感谢+1。 – capdragon 2011-05-27 18:19:03