【问题标题】:Can someone explain this javascript memory leak scenario to me有人可以向我解释这个 javascript 内存泄漏场景吗
【发布时间】:2013-03-19 10:11:50
【问题描述】:

http://www.ibm.com/developerworks/web/library/wa-memleak/ 在此链接上,清单 5 描述了 obj 是对 dom 元素的引用,而 dom 元素具有对 obj 的引用,因此会导致内存泄漏的情况。我正在努力查看代码中的哪些内容使 DOM 元素具有对 obj 的引用。 谁能给我解释一下?

取自页面:

在清单 5 中,您会看到一个闭包,其中 JavaScript 对象 (obj) 包含对 DOM 对象的引用(由 id “元素”引用)。反过来,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>

【问题讨论】:

    标签: javascript memory-leaks


    【解决方案1】:

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

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

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

    引用

    如果将 obj 设置为 null,则不会有对 onload-scope 内某些内容的引用。

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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多