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>
答案 0 :(得分:1)
由于 obj 和 onclick 之间的循环引用而存在内存泄漏。
通常,在执行 onload 之后,其范围内的所有变量都将被垃圾收集和擦除。 但是,在javascript中,执行后并不总是删除函数作用域。这称为闭包。
例如,如果外部对象引用此范围内的某些内容。在这种情况下,onclick 引用outerFunction 和 outerFunction 由 obj
引用
如果obj设置为 null ,则不会引用 onload-scope 中的内容。
有人可以说,引用仍然是 outerFunction ,这是正确的。但是outerFunction不再绑定到 onload-scope ,这使得这个范围有效,可以被垃圾收集器清理。