关闭JavaScript中的内存泄漏模式

时间:2014-06-10 09:57:23

标签: javascript memory-leaks closures

以下哪个JavaScript代码段会泄漏内存?

摘录#1:

function foo(obj)
{
    var obj2 = {};
    $('#something').click(function() { alert(obj.id); } );
}

摘录#2:

function foo(obj)
{
    var obj2 = {}
    $('#something').click(function() { alert('obj was not used.'); } );
}

摘录#3:

function foo(obj)
{
    var obj2= {id: 1}
    bar(function() { alert(obj2.id); } );
}

function bar(func)
{
    var obj3 = {};
    func();
}

哪些变量不会被垃圾收集器收集? 如何修复泄漏?

2 个答案:

答案 0 :(得分:3)

如上所述,这些都不会造成内存泄漏。

由于没有释放记忆而导致泄漏 - 一切都被释放。

顺便说一下,你所展示的代码都没有使用闭包。

现在,这里有一些"泄漏"可以创建。

// Simple leak -- an array that never lets go of memory
var arrayThatNeverShrinks = [];
function doleak() {
  var s = "1234567890";
  arrayThatNeverShrinks.push(s);
  window.setTimeout(doleak, 500);
}
//start if off
doleak();


// This function leaks because bigVar is used -- and kept -- 
// inside of the anonymous function inside.
    //Another leak, using closures
    var leakingFunction = (function() {
      var bigVar = "1234567890";
      return function() {
        alert("Hi there");
        var keepBigVar = bigVar;
      }
    }());

答案 1 :(得分:2)

老问题,但我在评分最高的答案中有几个问题 -

  

顺便说一下,你所展示的代码都没有使用闭包

snippet one中的click处理程序非常关闭 - 它会关闭传递给foo的obj参数。因此,在用另一个对象再次调用foo之前,不会释放为obj分配的内存。

不是说这里有泄漏 - 只是想指出一个代码片确实创建了一个闭包。

此外,

  

由于没有释放记忆而导致泄密 - 一切都被释放

对于#2和#3的片段,情况确实如此,但对于片段#1则不然。