【发布时间】:2013-11-15 21:17:10
【问题描述】:
我正在使用 jQuery 动态创建 HTML 元素,现在需要针对它们存储 JavaScript 数据。但是,我现在担心内存泄漏,因为我实际上从未对我的对象调用“删除”。我'.append'和'.detach'它们,但从不'.remove'。 jQuery 的文档似乎建议我应该调用 remove 来清理它在对象上的足迹 - 事件、数据等。
这在现代浏览器上是绝对必要的吗,或者对元素的任何引用的消失对我来说会这样做吗?
另一种表达我的问题的方式;这个脚本 sn-p 会泄漏内存吗?
function createElement()
{
var newDiv = $("<div>")
.data("test", "test data")
.appendTo(document.body)
.detach();
setTimeout(createElement, 10);
}
createElement();
就此而言,即使 没有 .data() 调用,这是否也会泄漏内存?
我对支持非常旧的浏览器不感兴趣。基本上是 IE9 和更好的。
【问题讨论】:
-
您可以使用浏览器的开发者工具来监控页面使用的内存。在 Chrome 中,它位于“时间轴”下。
-
jQuery 创建一个它在内部调用 $.cache 的对象,这是存储您使用 .data() 附加的所有数据的地方,元素本身仅获得一个包含 ID 的新属性用作 $.cache 对象检索数据的键。因此,jQuery 的 remove() 将删除存储在 $.cache 中的所有数据,它会删除所有事件处理程序,并尽最大努力清理您造成的所有混乱。 detach() 显然不会这样做,因为这就是关键,以保持与元素相关联的所有数据。通常你根本不必担心这个,因为它没有那么多 kb
-
作为旁注,data() 以这种方式工作以确保它不会泄漏内存或导致循环引用问题,而且不,数据不会在现代浏览器中消失(也不会在旧浏览器中消失) ) 因为它由 jQuery 在内部存储在一个特殊的对象中。
标签: javascript jquery dom