重复的.ajax调用导致jQuery内存泄漏

我正在使用以下模式,它在Firefox中泄漏内存:

$(function() { (function() { var callee = arguments.callee; $.ajax({ url: '...', success: function() { ... setTimeout(callee, 1000); }, error: function() { ... setTimeout(callee, 1000); } }); })(); }); 

即使成功/错误除了再次调用setTimeout之外什么都不做,内存泄漏仍然存在。 我通过Windows任务管理器观察泄漏; 如果页面保持打开状态,firefox.exe的内存使用量会逐渐增加。 对于此代码的最终版本,我只需要每分钟更新一次,但每隔一秒就会更快地显示内存泄漏!

(注意:这看起来像这个问题的一个非常相似的问题,但那里选择的答案似乎不适合Firefox)

我能够重现问题并解决它:

 $(function() { function checkStatus() { $.ajax({ url: '...', success: function() { ... setTimeout(checkStatus, 1000); }, error: function() { ... setTimeout(checkStatus, 1000); } }); } checkStatus(); }); 

似乎发生的是每次调用匿名方法时,它会创建一个变量并为其分配引用。 如果有足够的时间,这将填补内存。

这个解决方案只传递相同的函数ref,而不是每次迭代创建一个新函数。

也许值得尝试这样的事情?

 $(function() { (function() { var callee = arguments.callee; $.ajax( { url: '...', success: function() { ... setTimeout(function() { callee(); }, 1000); }, error: function() { ... setTimeout(function() { callee(); }, 1000); } }); })(); }); 

所以将calle传递给setTimeout回调的instad,传递一个调用calle的匿名函数。

尝试将callee放在函数之外,如下所示:

 var callee = arguments.callee; $(function() { (function() { $.ajax({ url: '...', success: function() { ... setTimeout(callee, 1000); }, error: function() { ... setTimeout(callee, 1000); } }); })(); }); 

因此,内存只为“被调用者”分配一次,而不是每次执行函数时。