我应该看什么样的内存泄漏与jQuery的数据()?(What sort of memory leak

2019-07-29 09:16发布

我应该配对每个数据()用后removeData调用()调用?

我的假设:jQuery的remove()方法将删除从DOM元素,如果我没有任何其他的引用删除,我没有做任何更多的清理。

但是,如果我有一些javascript被删除VAR或对象指的是要素之一,我需要清理一下,和我假设应用到jQuery的数据功能,也因为它在某种程度上引用的元素。

所以,如果我确实需要删除之前调用removeData,有没有快捷方式删除与元素相关联的所有数据,或者我必须通过名称明确要求各?

编辑:我通过源代码看了一下,证实了Borgar和roosteronacid说。 拆下取出DOM的元素,并删除任何事件,并存储在他们的数据 - 这是方便,但让我不知道什么时候使用removeData()。 也许不常有。

Answer 1:

jQuery的数据不保留对元素的引用,这样你就不用担心内存泄漏。 其预期的目的就是为了解决这个确切的问题。

它是如何工作的轻微简化:

的ID构件被添加到每个“接触” DOM节点。 涉及该DOM元素的后续操作使用该ID。

var theNode = document.getElementById('examplenode');
theNode[ 'jQuery' + timestamp ] = someInternalNodeID;

您可以使用相同的功能jQuery使用访问ID:

someInternalID = jQuery.data( document.body );

当您将数据追加到该节点它存储的jQuery对象上,该节点的内部ID提交下。 您的$(element).data(key,value)内部转换为类似:

jQuery.cache[ someInternalNodeID ][ theKey ] = theValue;

一切都进入相同的结构,包括事件处理程序:

jQuery.cache[ someInternalNodeID ][ 'events' ][ 'click' ] = theHandler;

当一个元件被去除,jQuery的因此可以扔掉的所有数据(和事件处理程序)与一种简单的操作:

delete jQuery.cache[ someInternalNodeID ];

从理论上说,你可以因此也删除jQuery的,不得接受任何引用发生泄漏。 jQuery的甚至支持库的多个单独的实例,各持一组自己的数据或事件。

你可以看到约翰Resig的解释这个东西了“DOM是一个烂摊子”的演讲 。



Answer 2:

jQuery的整点是从抽象蹩脚的JavaScript实现和错误在浏览器中..如内存泄漏掉:)

.. 对; 当该元素被从DOM除去所有相关联的数据,以一个元件将被去除。



Answer 3:

总的来说,JavaScript是关于知道什么时候适合收集垃圾还算不错,除非你写的很大规模或长期运行的客户端应用程序,我会说涉及的内存主要是无关紧要的,并试图第二猜测它是不是会获得你很多。

确定哪些jQuery中未完成的词汇倒闭或其他棘手的JavaScript仍可能访问你给出的数据可能会在某些情况下,相当复杂。

据我所知,不过,如果你存储,无论你使用jQuery的数据功能得到了那就继续元素被删除后,所以去除引用的将是必要的,也是存在的参考。 一些简单的测试案例会给你一个更明确的答案。



文章来源: What sort of memory leaks should I watch for with jQuery's data()?