代码之家  ›  专栏  ›  技术社区  ›  Bobby Jack

带有重复的.ajax调用的jQuery内存泄漏

  •  7
  • Bobby Jack  · 技术社区  · 14 年前

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

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

    (注意:这看起来与 this question

    3 回复  |  直到 7 年前
        1
  •  4
  •   Matthew    14 年前

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

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

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

        2
  •  0
  •   Alex Pacurar    14 年前

    也许值得试试这样的东西?

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

    因此,instad of passing calle to the setTimeout callback,pass an anonymous function that calle。

        3
  •  -3
  •   user258030    14 年前

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

    这样就只为“被调用方”分配一次内存,而不是每次执行函数时都分配内存。