javascript关闭:他们如何开始泄漏内存

时间:2011-01-11 14:21:27

标签: javascript jquery performance

许多程序员认为javascript关闭开始泄漏内存。

我想看一些发生这种情况的例子。

我不希望看到闭包被添加为事件到dom元素并删除IE中的dom元素。如下面的链接

function foo(value) {   
    var bar = document.getElementById("selector");
    bar.attachEvent("onclick", 
        // closure
        function() {
            alert(value);  
        }
    ); 
}

我想看看其他一些闭包可能会泄漏的情况。

1 个答案:

答案 0 :(得分:3)

总结一下jAndy的链接(全部图片仍然在链接之后)。

关闭它们自我并不是一个大问题,只要关闭存在,当你不明白继承范围内的所有东西都继续存在时,就会出现问题。

实施例

function doAmazingGrace() {

    // gigantic list of stuff!
    var list = [...]; 
    var result = magicComputationOnTheList();

    // readOnlyResults for whatever reason....
    return {
        get: function() {
            return result;
        }
    }
}

result本身不是问题,因为它必须依赖才能使闭包起作用,但是list将被“泄露”,除非你松开对闭包的引用它会去因此,从技术上讲,它不是泄漏。

但只要封闭存在,你就在那里保留对list的引用,这是不需要的。

因此,为了解决这个问题,在返回对象之前使用delete listlist = null是明智的,这样可以对阵列进行垃圾回收。

第二个问题是循环引用,但这不是一个闭包问题,你总是可以引入循环引用,它们泄漏的时间和长度也取决于垃圾收集器摆脱它们的能力。 V8做得很好,旧的IE版本虽然存在极端问题。