11

以下代码是否会造成内存泄漏。

根据 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'));
4

4 回答 4

7

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

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

如果没有深入了解 javascript 引擎如何实现垃圾收集,我无法就该主题发表权威性发言。但是,我对垃圾收集的一般理解使我认为您的代码将是“安全的”,因为#something从 DOM 中删除元素后,生成的MyClass对象只会引用没有其他连接的对象。垃圾收集器的图形算法应该能够识别出 DOM 元素及其MyClass对象是“漂浮在空间中的”并且与其他所有内容无关。

此外,一旦从 DOM 中删除与给定 DOM 元素相关联的数据和事件,jQuery 会不遗余力地去除它。从文档中:

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

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

因此,只要在MyClass移除 DOM 元素后没有其他东西引用该对象,就不会出现内存泄漏。

于 2011-08-16T16:31:33.887 回答
0

我想这取决于 Javascritp 引擎。

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

因此,我认为 IE8 和 Chrome 中都没有泄漏。

但我也无法重现这些泄漏模式

于 2011-08-16T16:47:58.833 回答
0

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

当然,当你删除缓存数据时,jQuery 会取消引用数据。但是内部缓存是一个递增的数组,当你使用它时,它会继续。

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

于 2017-06-23T07:20:12.353 回答
-4

data 属性只存储字符串值。

于 2011-08-16T16:19:51.543 回答