2011-08-16 146 views
11

下面这段代码是否会造成内存泄漏。jQuery.data会导致内存泄漏吗?

据jQuery的文档使用data功能避免了内存泄漏。确认以下内容是否安全将是有用的。

var MyClass = function(el) { 
    // Store reference of element in object. 
    this.element = $(el); 
}; 

// Store reference of object in element. 
$('#something').data('obj', new MyClass('#something')); 
+0

为什么你不保存全局js对象的引用? –

+0

@ant_Ti我想要双向访问。例如,在一个事件处理程序中,我想访问'obj',但我也想从'obj'中访问该元素。 –

+0

我编辑了这个问题以删除提及的循环引用,因为这个例子不包含循环引用。 (虽然看起来可能) – mikerobi

回答

7

显然的代码,因为它主张只要DOM元素仍然连接到DOM会占用更多的内存。但我猜你在问DOM元素不再使用后是否会继续使用额外的内存。

更新:感谢Joey的答案(这是他自删除),我花了一些时间在memory leaks in javascript读书了,它出现在我的下一段的假设是不正确的。因为DOM元素不使用纯垃圾收集,所以像这样的循环引用通常会阻止DOM元素和javascript对象被释放。但是,我相信这个答案的其余部分仍然是正确的。

没有的JavaScript引擎如何实现垃圾收集有深入的了解,我不能权威作主题演讲。但是,我对垃圾收集的一般理解使我认为,从DOM中删除 #something元素后,您的代码将是“安全”的,因此生成的 MyClass对象只会引用一个没有其他连接的对象。垃圾回收器的图形算法应该能够识别DOM元素及其对象“浮在空中”并且与其他任何东西都不相关。

此外,jQuery一旦从DOM中移除数据和与给定DOM元素关联的事件,就会消失。从documentation

jQuery的确保当DOM元件经由jQuery方法除去数据被去除,并且当用户离开网页。

因此,假如你使用jQuery一致,一旦对象从DOM无论如何,这使得它 更加容易 可能的垃圾收集知道它可以得到去除,你只会有一个单向参考摆脱这些物体。

所以只要你没有的东西,一旦DOM元素被删除别人引用MyClass对象,你不应该有内存泄漏。

+0

谢谢,真的有帮助 –

-4

data属性只存储字符串值。

+2

在jQuery中,它可以是任何Javascript类型,包括Array或Object。 –

+0

@ant_Ti - 它在文档中说什么? – Neal

+0

[.data()](http://api.jquery.com/data/)描述说**值**新数据值;它可以是任何包含Array或Object的Javascript类型。 –

0

我想这取决于Javascritp引擎。

你有问题恰恰足够多的进行测试。我在对象中添加了一个长字符串,并在大循环中运行了潜在的泄漏。

因此,我不认为在IE8和Chrome的泄漏。

但我无法重现these leakeage patterns无论是。

0

这可能导致内存泄漏。 jQuery.data方法的理论可能会使用A Data内部类缓存dom元素的数据。

当然,当您删除缓存数据时,jQuery将不会引用数据。 但内部缓存是一个增加数组,当你你它,它会继续。

所以,最后会有很大的缓存数组,这会导致memeory泄漏。 在长期的网络应用程序中,这可能会泄漏内存崩溃。