Javascript 此模式如何获得循环引用

Javascript 此模式如何获得循环引用,javascript,memory-leaks,Javascript,Memory Leaks,全部: 我对Javascript内存管理相当陌生,目前阅读: 在本文中,对于清单5,解释如下: 在清单5中,您可以看到一个闭包,其中包含一个JavaScript对象(obj) 包含对DOM对象的引用(由id“元素”引用)。 DOM元素又有一个对JavaScript对象的引用。这个 JavaScript对象和DOM之间产生的循环引用 对象导致内存泄漏 有谁能给我一些关于这个模式是如何建立循环引用并导致内存泄漏的详细信息吗(非常感谢一个图表)?特别是这一部分: DOM元素又有一个对JavaScri

全部:

我对Javascript内存管理相当陌生,目前阅读:

在本文中,对于清单5,解释如下:

在清单5中,您可以看到一个闭包,其中包含一个JavaScript对象(obj) 包含对DOM对象的引用(由id“元素”引用)。 DOM元素又有一个对JavaScript对象的引用。这个 JavaScript对象和DOM之间产生的循环引用 对象导致内存泄漏

有谁能给我一些关于这个模式是如何建立循环引用并导致内存泄漏的详细信息吗(非常感谢一个图表)?特别是这一部分:

DOM元素又有一个对JavaScript对象的引用

document.write(“通过闭包说明内存泄漏的程序”);
window.onload=函数outerFunction(){
var obj=document.getElementById(“元素”);
obj.onclick=函数innerFunction(){
警惕(“嗨!我要泄密”);
};
obj.bigString=newarray(1000).join(newarray(2000).join(“XXXXX”));
//这是用来使泄漏明显
};

单击我
只有当您计划在某个时候删除按钮元素时,才会出现问题

循环引用是由于
outerFunction
导致的关闭而发生的:
innerFunction
是按钮的单击事件侦听器,它将引用按钮的
obj
。因此,删除按钮将不会生效,因为对它的引用将始终存在(在其自己的单击事件侦听器中),从而阻碍垃圾收集器

当JS中的对象不再有任何引用时,垃圾收集器会删除该对象。通过执行以下操作从DOM中删除按钮,例如:

document.getElementById("element").remove();
将从DOM中删除对该按钮的引用,但垃圾收集器将无法删除该按钮,因为
innerFunction
中会有对该按钮的另一个引用,即对
obj
(其中包含对该按钮的引用)

此处的循环引用是,要删除/销毁
innerFunction
,必须先销毁按钮,要删除/销毁按钮,必须删除对按钮的所有引用,包括
innerFunction
中的引用


注意:在最近的浏览器中,您可能会提到那些导致内存泄漏的事件侦听器。

谢谢,所以您只说上面的代码没有问题?我想知道为什么它会评论://这是用来使泄漏变得重要的。另外,我想知道,对于GC来说,这个例子中的内存应该收集到什么?@Kuan 1。这是用来使泄漏变得重要的,这意味着我们正在将更多的数据附加到我们的按钮对象上,因此,当它的内存泄漏时,整个按钮对象(带有额外的大量数据)将保留在内存中,尽管我们认为它已被删除。@Kuan 2。CG需要收集button对象,包括与该对象关联/附加的所有数据,如
bigString
innerFunction
(onclick)。现代Javascript实现不像编写该文档时那么糟糕。我认为这个模式不再是一个问题。@user2357112谢谢,所以就代码而言,我有点想知道什么部分需要GC收集回来(因为如果它可能导致泄漏,它一定有一些需要收集的东西)?