jQuery.data会导致内存泄漏吗?

Lea*_*yes 11 javascript jquery memory-leaks circular-reference

下面的代码会产生内存泄漏吗?

根据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'));
Run Code Online (Sandbox Code Playgroud)

Str*_*ior 7

显然,只要DOM元素仍然连接到DOM,代码就会占用额外的内存.但我猜你在询问DOM元素不再使用后是否会继续使用额外的内存.

更新:感谢Joey的回答(他已经删除了),我花了一些时间阅读javascript中的内存泄漏,看来我在下面段落中的假设是不正确的.因为DOM元素不使用纯垃圾收集,所以像这样的循环引用通常会阻止DOM元素和javascript对象被释放.但是,我相信这个答案的其余部分仍然是正确的.

如果没有深入了解javascript引擎如何实现垃圾收集,我就不能权威地谈论这个话题.但是,我对垃圾收集的一般理解使我认为你的代码是"安全的",因为在#something从DOM中删除元素之后,生成的MyClass对象只能引用一个没有其他连接的对象.垃圾收集器的图算法应该能够识别DOM元素及其MyClass对象是"浮动在空间中"并且与其他所有内容都没有关联.

此外,一旦从DOM中删除了与给定DOM元素相关联的数据和事件,jQuery就会不加考虑.从文档:

jQuery确保在通过jQuery方法删除DOM元素时以及当用户离开页面时删除数据.

因此,假设您始终使用jQuery,一旦从DOM中删除对象,您将只有一个单向引用,这使垃圾收集器更容易知道它可以摆脱这些对象.

因此,只要在MyClass删除DOM元素后没有其他引用该对象的内容,就不应该有内存泄漏.