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

pen*_*ake 7 javascript jquery memory-leaks expando

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

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

为什么使用:

document.body.foo = 52; 
Run Code Online (Sandbox Code Playgroud)

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

jQuery.data(document.body, 'foo', 52);
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,

burak ozdogan

小智 7

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

假设您有变量nodeOnenodeTwo哪些引用节点.

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

jQuery.data(nodeOne, 'item', nodeTwo);
jQuery.data(nodetwo, 'item', nodeOne);
Run Code Online (Sandbox Code Playgroud)

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

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

但是,如果你要做同样的事情但使用jQuery.data ,即使不再需要变量,也不会对nodeOnenodeTwo变量进行垃圾回收.

-

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

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


And*_*y E 5

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

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

话虽如此,我认为大多数人建议尽可能不使用expandos(通常是可能的).data()无论如何,使用jQuery 是一个很好的选择.


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

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

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