重复的.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); } }); })(); });
因此,内存只为“被调用者”分配一次,而不是每次执行函数时。
- 如何在Firefox插件上使用jQuery 1.5.2+?
- jQuery AJAX状态“200 OK”,但没有数据响应
- jQuery click事件在firefox中被激活了两次但在IE中没有
- 如何使用jQuery在firefox中获取background-position-y?
- 语法错误:缺少}属性列表后
- AJAX调用适用于Chrome和Safari,但不适用于Firefox和IE?
- jQuery Animation error =尝试在已清除的范围上运行compile-and-go脚本
- Evil Firefox错误 – “基础对象不支持参数或操作”
- window.location.reload不适用于Firefox和Chrome