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

时间:2010-09-01 11:20:16

标签: jquery firefox memory-leaks

我正在使用以下在Fi​​refox中泄漏内存的模式:

$(function() {

    (function() {

        var callee = arguments.callee;

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

    })();

});

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

(注意:这看起来与this question非常相似,但所选答案似乎不适合Firefox)

3 个答案:

答案 0 :(得分:4)

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

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

    }

    checkStatus();

});

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

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

答案 1 :(得分:0)

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

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

而不是将calle传递给setTimeout回调,传递一个调用calle的匿名函数。

答案 2 :(得分:-3)

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

var callee = arguments.callee;

$(function() {

    (function() {

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

    })();

});

所以内存只为“callee”分配一次,而不是每次执行函数时都会分配。