![]() |
1
6
jQuery代码中的最后一件事(在Sizzle代码之前,它的选择器引擎)是这样的(这是防止泄漏的代码):
当您在jQuery中执行任何操作时,它既存储了它所做的操作(即函数),也存储了它所做的操作(即DOM元素)。onunload通过jQuery缓存从它自己的内部缓存的事件处理程序中删除函数(不管怎样,事件都存储在这里,而不是存储在单个DOM节点上)。
确保它只在IE上运行。 |
![]() |
2
2
当您通过库执行所有操作时,JQuery只能确保没有泄漏。jQuery中有一些称为“empty”和“cleanData”的例程,您可以仔细阅读这些例程以查看到底发生了什么,但基本上,代码只是在释放DOM元素之前将它所知道的一切从DOM元素中分离出来。当您执行诸如用“.html()”或“.load()”覆盖元素内容之类的操作时,将调用该例程。 就我个人而言,在这种情况下,我对“担保”这样的术语相当谨慎。 |
![]() |
3
1
重写以进一步澄清 直接的 对闭包中活动DOM节点的引用。垃圾收集器(JS&传统浏览器(如IE6)的DOM)不能使这些引用无效。因此,需要在函数末尾取消节点引用。 jQuery在默认情况下避免了这一点,因为活动DOM元素作为属性/属性附加到jQuery对象,通过这些属性,上述垃圾收集器可以轻松确定空引用。如果jQuery对象有空引用,那么它将被简单地清除,并且它的属性/属性(在本例中是对活动DOM元素的引用)也会随之清除。 因此,为了避免这种内存泄漏,需要让一个对象维护对活动DOM节点的引用,然后在闭包中引用该对象。闭包将只维护对对象的引用,而不维护活动DOM元素,因为该引用属于该对象。
为事件系统创建包装器会增加一些代码,但这是必不可少的。其主要思想是添加一个通用的eventHandler,将事件委托给存储所需引用的事件缓存/系统。在unload事件中,缓存被清除,打破循环引用,允许垃圾收集器(JS和DOM)整理自己的角落。 |
![]() |
payloc91 · 存储地图中的条目是否安全?它会导致内存泄漏吗? 6 年前 |
![]() |
pjj · 如果GC'ed是弱可达对象,那么为什么会出现OOM错误 7 年前 |
![]() |
K.R. · RxJava行为主体和使用者-这里是否存在内存泄漏? 7 年前 |
![]() |
eaglefreeman · 意外的R内存管理行为 7 年前 |
![]() |
areify · 如何避免此代码中的内存泄漏? 7 年前 |