以下代码段是否会造成内存泄漏。
根据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 :(得分:7)
显然,只要DOM元素仍然连接到DOM,代码就会占用额外的内存。但我猜你在询问是否会在DOM元素不再使用后继续使用额外的内存。
更新:感谢Joey的回答(他已经删除了),我花了一些时间阅读memory leaks in javascript,看来我在下面段落中的假设是不正确的。因为DOM元素不使用纯垃圾收集,所以像这样的循环引用通常会阻止DOM元素和javascript对象被释放。但是,我相信这个答案的其余部分仍然是正确的。
如果没有深入了解javascript引擎如何实现垃圾收集,我就不能权威地谈论这个话题。但是,我对垃圾收集的一般理解让我认为你的代码是“安全的”,因为在从DOM中删除 #something
元素之后,生成的MyClass
对象只会有一个引用到没有其他连接的对象。垃圾收集器的图算法应该能够识别DOM元素及其MyClass
对象“在空间中浮动”并且与其他所有对象无关。
此外,一旦从DOM中删除了与给定DOM元素相关联的数据和事件,jQuery就会脱掉它。来自documentation:
jQuery确保在通过jQuery方法删除DOM元素时以及当用户离开页面时删除数据。
因此,假设您始终使用jQuery,一旦从DOM中删除对象,您将只有一个单向引用,这使得更容易可能让垃圾收集器知道它可以摆脱这些对象。
因此,只要删除DOM元素后没有其他引用MyClass
对象的内容,就不应该有内存泄漏。
答案 1 :(得分:0)
我认为这取决于Javascritp引擎。
您确实需要进行测试。我在对象中添加了一个长字符串,并在一个大循环中运行潜在的泄漏。
因此,我认为在IE8或Chrome中没有漏洞。
但我也无法重现these leakeage patterns。
答案 2 :(得分:0)
这可能导致内存泄漏。 jQuery.data方法的理论可以使用A Data内部类来缓存dom元素的数据。
当然,当你删除缓存数据时,jQuery会取消引用数据。 但是内部缓存是一个不断增加的数组,当你使用它时,它会继续。
所以,最后,会有一个非常大的缓存阵列,这将导致记忆泄漏。 在长期运行的Web应用程序中,这可能会导致内存崩溃。
答案 3 :(得分:-4)
data属性仅存储字符串值。