有人可以向我解释这个javascript内存泄漏场景

时间:2013-03-19 10:11:50

标签: javascript memory-leaks

http://www.ibm.com/developerworks/web/library/wa-memleak/在此链接上,清单5描述了一种情况,其中obj是对dom元素的引用,而dom元素具有对obj的引用,因此导致内存泄漏。我很难看到代码中的内容使DOM元素引用了obj。 有人可以向我解释一下吗?

摘自页面:

在清单5中,您将看到一个闭包,其中JavaScript对象(obj)包含对DOM对象的引用(由id“element”引用)。反过来,DOM元素引用了JavaScript obj。 JavaScript对象和DOM对象之间的结果循环引用会导致内存泄漏。

清单5.事件处理内存泄漏模式

<html>
<body>
<script type="text/javascript">
document.write("Program to illustrate memory leak via closure");
window.onload=function outerFunction(){
    var obj = document.getElementById("element");
    obj.onclick=function innerFunction(){
    alert("Hi! I will leak");
    };
    obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
    // This is used to make the leak significant
};
</script>
<button id="element">Click Me</button>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

由于 obj onclick 之间的循环引用而存在内存泄漏。

通常,在执行 onload 之后,其范围内的所有变量都将被垃圾收集和擦除。 但是,在javascript中,执行后并不总是删除函数作用域。这称为闭包

例如,如果外部对象引用此范围内的某些内容。在这种情况下,onclick 引用outerFunction outerFunction obj

引用

illustration of a closure-caused memory leak

如果obj设置为 null ,则不会引用 onload-scope 中的内容。

有人可以说,引用仍然是 outerFunction ,这是正确的。但是outerFunction不再绑定到 onload-scope ,这使得这个范围有效,可以被垃圾收集器清理。