javascript闭包:如何开始泄漏内存

javascript闭包:如何开始泄漏内存,javascript,jquery,performance,Javascript,Jquery,Performance,许多程序员认为javascript闭包开始泄漏内存 我想看看发生这种情况的一些例子 我不想看到闭包作为事件添加到dom元素中,并在IE中删除dom元素,如下面的链接所示 function foo(value) { var bar = document.getElementById("selector"); bar.attachEvent("onclick", // closure function() { alert

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

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

我不想看到闭包作为事件添加到dom元素中,并在IE中删除dom元素,如下面的链接所示

function foo(value) {   
    var bar = document.getElementById("selector");
    bar.attachEvent("onclick", 
        // closure
        function() {
            alert(value);  
        }
    ); 
}
我想看看其他一些情况下闭包可能开始泄漏。

在jAndy的链接上总结一下(对于全图,请继续链接)

闭包本身并不是一个大问题,当您不了解继承作用域中的所有内容在闭包存在时都会继续存在时,问题就会出现

例子
result
本身不是问题,因为它必须继续存在才能使关闭生效,但是
list
将被“泄漏”,除非您松开对关闭的引用,否则它将消失,因此从技术上讲它不是泄漏

但只要闭包继续存在,您就可以在其中保留对
list
的引用,这是不需要的

因此,为了修复它,最好在返回对象之前使用
delete list
list=null
,这样就可以对数组进行垃圾收集

第二个问题是循环引用,但这不是一个闭包问题,您始终可以引入循环引用,它们是否泄漏以及泄漏的时间也取决于垃圾收集器清除它们的能力。V8在这方面做得很好,但是旧的IE版本在这方面有着极端的问题。

总结一下jAndy的链接(对于完整的图片,仍然跟随链接)

闭包本身并不是一个大问题,当您不了解继承作用域中的所有内容在闭包存在时都会继续存在时,问题就会出现

例子
result
本身不是问题,因为它必须继续存在才能使关闭生效,但是
list
将被“泄漏”,除非您松开对关闭的引用,否则它将消失,因此从技术上讲它不是泄漏

但只要闭包继续存在,您就可以在其中保留对
list
的引用,这是不需要的

因此,为了修复它,最好在返回对象之前使用
delete list
list=null
,这样就可以对数组进行垃圾收集

第二个问题是循环引用,但这不是一个闭包问题,您始终可以引入循环引用,它们是否泄漏以及泄漏的时间也取决于垃圾收集器清除它们的能力。V8在这方面做得很好,但旧的IE版本在这方面有极端的问题

function doAmazingGrace() {

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

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