javascript事件处理程序是否存在于内存中,即使它绑定到的DOM元素被删除?

javascript事件处理程序是否存在于内存中,即使它绑定到的DOM元素被删除?,javascript,jquery,memory-leaks,Javascript,Jquery,Memory Leaks,给定以下代码 <div id="app"> <div id="foo" /> </div> <script> $('#foo').bind('click', function(){}); </script> $('#foo').bind('click',function(){}); 我计划替换#app[例如$(“#app”).html(“…”);,或innerHTML=“…”;]的内容。我知道我可以使用jQuery的.r

给定以下代码

<div id="app">
  <div id="foo" />
</div>

<script>
  $('#foo').bind('click', function(){});
</script>

$('#foo').bind('click',function(){});
我计划替换#app[例如
$(“#app”).html(“…”);
,或
innerHTML=“…”;
]的内容。我知道我可以使用jQuery的
.remove()
,它调用一个
“destroy”
处理程序来解除事件绑定。事实上,有一个
destroy
处理程序被设置为删除事件,这让我相信,在不解除事件绑定的情况下,当删除DOM元素时,处理程序仍将存在于内存中


因此,如果DOM元素
#foo
不再存在,那么处理程序是否也会消失,或者在浏览器内存中丢失?

jQuery会跟踪事件处理程序本身,这就是为什么如果您不是通过jQuery方法从DOM中删除元素,则需要使用
解除绑定
(现在是)(如果您使用jQuery的
empty
remove
,正如您所提到的,它本身会处理这个问题)。这是为了让jQuery知道它可以释放对处理程序的引用

如果不是因为这个,那么在理论上,你就不必做任何事情,因为一旦DOM元素从内存中删除,它就不再是可访问的,因此在理论上不应该将事件处理程序保留在内存中。这是理论。现实是非常不同的,很容易出现这样的情况(特别是在IE上)在这种情况下,DOM元素和事件处理程序都不能被清除,因为它们都会导致另一个被粘住——内存泄漏。JavaScript对循环引用没有问题(它理解它们,并且可以释放两个相互指向的对象,只要没有其他对象指向它们),但浏览器的DOM部分可能使用不同的语言编写,并使用不同的垃圾收集机制(即使用COM,它使用引用计数而不是可达性)。jQuery可以帮助您避免IE的这一陷阱(它跟踪事件处理程序的部分原因),但您必须使用
解除绑定
(现在
关闭
)(或通过
清空
删除
等删除元素)作为结果

外卖消息:当您钩住时,您也应该解开。:-(和/或在删除元素时使用jQuery,因为它将处理这个问题。)


有些关联:如果您经常添加和删除元素,您可能会查看事件委派(jQuery通过委派签名使其变得非常简单)是否有帮助。

刚刚碰巧阅读了jQuery方法上的文档:

为了避免内存泄漏,jQuery删除 其他构造,如数据和 子元素中的事件处理程序 在移除元件之前 他们自己


我也想知道。不太确定,但我想如果java发现一个对象不再被使用,它会在一段时间后清理自己。@robx:JavaScript,不是java。是的,JavaScript是一种垃圾收集语言,但浏览器的DOM部分可能不是(几乎肯定不是)用JavaScript.Woop写的,我一直在思考我自己不确定的东西;)我认为可能是重复的。我正在为一个应用程序使用Backbone.js,在源代码或文档中没有看到任何关于在Backbone.View中设置的解除绑定事件的内容。我看到的许多主干的在线示例也没有解除绑定任何事件(调用“new View()”覆盖元素中的内容,但不解除绑定元素以前的子元素)。我想确保我解释了这些内存泄漏,如果它们出现的话。