javascript闭包:如何开始泄漏内存
许多程序员认为javascript闭包开始泄漏内存 我想看看发生这种情况的一些例子 我不想看到闭包作为事件添加到dom元素中,并在IE中删除dom元素,如下面的链接所示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
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;
}
}
}