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

标签 javascript memory-leaks

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

摘自页面:

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

list 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>

最佳答案

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

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

例如,如果一个外部对象引用了这个范围内的东西。在这种情况下,onclick 引用 outerFunction 并且 outerFunctionobj 引用

illustration of a closure-caused memory leak

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

可以争辩说引用仍然指向 outerFunction,这是正确的。但是 outerFunction 不再绑定(bind)到 onload-scope,使这个范围有效地被垃圾收集器清理。

关于javascript - 有人可以向我解释这个 javascript 内存泄漏场景吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15496585/

相关文章:

javascript - 移动元素的最佳方式(性能方面)

javascript - 如何在不使用参数的情况下创建 javascript 函数的实例

delphi - TWebbrowser 大量内存泄漏 : no solution so far

c - 在 C 函数中分配内存

javascript - 带有 $http 的 AngularJS 指令会造成内存泄漏 - .resolve 似乎不起作用?

javascript - 根据 3 种颜色的值生成 16 种颜色

javascript - Facebook JavaScript SDK - getLoginStatus 始终返回未知

javascript - 迭代表格的所有子元素并重置背景颜色

c - 如何使用 Linux list.h API 避免内存泄漏

c# - 每次加载新的 JQuery 插件 DataTables 时都会加载更改事件导致内存泄漏