为什么jQuery的.data()函数能更好地防止内存泄漏?

关于jQuery实用程序函数jQuery.data(),在线文档说:

“jQuery.data()方法允许我们以一种不受循环引用安全的方式将任何类型的数据附加到DOM元素,从而避免内存泄漏。”

为什么使用:

document.body.foo = 52; 

可以导致内存泄漏 – 或者在什么条件下 – 以便我应该使用

 jQuery.data(document.body, 'foo', 52); 

在任何情况下,我是否总是更喜欢.data()而不是使用expandos?

(如果你能提供一个比较差异的例子,我将不胜感激)

谢谢,

burak ozdogan

更准确的原因是它在你给出的引用中所说的内容:“不受循环引用的影响。”

假设您有变量nodeOnenodeTwo ,它们引用节点。

比如说你把它放在一个函数中(你没有存储它的引用):

 jQuery.data(nodeOne, 'item', nodeTwo); jQuery.data(nodetwo, 'item', nodeOne); 

在函数运行之后,有一个循环引用:nodeOne有一个对nodeTwo的引用,反之亦然。

通过使用jQuery.data,该循环引用不会阻止这两个变量被垃圾回收。

但是,如果您在使用jQuery.data的情况下执行相同操作,则即使不再需要变量,也不会对nodeOnenodeTwo变量进行垃圾回收。

在任何情况下,我是否总是更喜欢.data()而不是使用expandos?

除非您正在进行大量数据设置并且需要额外的性能下降(并且您可以通过使用性能分析来判断)并且确定您不会创建循环引用(或者至少是一个重要的数字),那么是的,你也可以只使用jQuery.data。

我很确定你不能引入像52这样的原始值的内存泄漏。 使用expandos时,内存泄漏通常在应用包含带有引用返回元素的对象的值时发生。

我建议阅读循环参考标题的内容, url为http://msdn.microsoft.com/en-us/library/Bb250448 。 更好的是,全部阅读:-)

话虽如此,我认为大多数人建议尽可能使用expandos(通常是可能的)。 在任何情况下,使用jQuery的data()都是一个不错的选择。


刚刚意识到我没有回答你的问题大声笑。 jQuery的data()提供了类似如下的方法:

  1. jQuery计算数据的唯一ID
  2. 使用唯一ID将数据存储在data()方法可用的对象中
  3. expando属性应用于具有唯一ID作为原始值的元素

无论何时调用data()来获取数据,jQuery都会访问expando属性以获取唯一ID,并使用该ID从缓存对象中获取数据。 因为expando包含原始值并且没有附加到缓存对象,所以不会发生循环引用。

关于这个主题的一些很好的阅读

JavaScript中的内存泄漏模式