jQuery的data()方法会引起哪些内存泄漏需要注意?

6
我应该将每个data()调用与稍后的removeData()调用配对吗?
我的假设:jQuery的remove()将从DOM中删除元素,如果我没有其他删除引用,我就不必进行任何更多的清理。
然而,如果我有一些javascript变量或对象引用正在被删除的其中一个元素,我需要清理它,我认为这也适用于jQuery的数据函数,因为它以某种方式引用了元素。
所以如果我确实需要在删除之前调用removeData,是否有一种快捷方式可以删除与元素相关联的所有数据,还是我必须逐个显式地调用每个名称?
编辑:我查看了源代码并确认了Borgar和roosteronacid所说的。删除将元素从dom中取出并删除任何事件和存储在其中的数据-这很方便,但让我想知道什么时候会使用removeData()。可能不经常使用。
3个回答

13
jQuery的数据不保留对元素的引用,这样您就不必担心内存泄漏。其预期目的是解决这个问题。
如何工作的一个简单化版本:
给每个“触摸”DOM节点添加一个id成员。之后涉及该DOM元素的所有操作都使用该id。
var theNode = document.getElementById('examplenode');
theNode[ 'jQuery' + timestamp ] = someInternalNodeID;

您可以使用与jQuery相同的函数访问id:

someInternalID = jQuery.data( document.body );

当您将数据附加到节点时,它将存储在jQuery对象中,以节点的内部ID为字段。您的$(element).data(key,value)在内部翻译成类似以下内容:
jQuery.cache[ someInternalNodeID ][ theKey ] = theValue;

所有的内容都放在同一个结构中,包括事件处理程序:

jQuery.cache[ someInternalNodeID ][ 'events' ][ 'click' ] = theHandler;

当一个元素被移除时,jQuery可以通过一次简单的操作丢弃所有数据(和事件处理程序):

delete jQuery.cache[ someInternalNodeID ];

理论上,您可以删除jQuery而不会出现任何引用泄漏。甚至支持多个独立的库实例,每个实例都拥有自己的数据或事件。您可以在“The DOM Is a Mess”演示文稿中看到John Resig解释这些内容。

5
请注意,只有使用jQuery的.remove()方法才是安全的,因为它会清理存储的数据。如果你自己从DOM中删除元素,jQuery就不知道要清理它,直到页面关闭之前你都会有一个泄漏问题。 - Jeremy
有人知道我可以用.data()存储多少以MB或KB为单位的数据吗? - EaBengaluru

2

jQuery的整个意义在于抽象掉糟糕的JavaScript实现和浏览器中的错误,例如内存泄漏 :)

是的,当一个元素从DOM中移除时,与该元素相关的所有数据都将被删除。


0
总的来说,JavaScript 在知道何时收集垃圾方面表现得相当不错,除非您正在编写非常大规模或长时间运行的客户端应用程序,否则我认为所涉及的内存基本上是微不足道的,并且试图猜测它不会给您带来太多好处。
在某些情况下,确定未完成的词法闭包或其他棘手的 jQuery 中的 JavaScript 可能会相当复杂。
据我所知,如果您使用 jQuery 的数据函数获取了任何内容的引用,则在删除元素后它将继续存在,因此还需要删除该引用。一些简单的测试用例将为您提供更明确的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接