|
|
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)整理自己的角落。 |
|
|
SkyBlue · Java Spring服务的内存/垃圾收集器问题 2 年前 |
|
|
Guy_Hanan · 一个关于C++程序内存泄漏的问题 2 年前 |
|
|
yeerk · 在Python中跟踪特定对象的引用(内存泄漏) 2 年前 |
|
|
Priyanshu Sinha · Django内存泄漏/工人人数减少 2 年前 |
|
|
lHumanizado · Golang defer并不总是执行 3 年前 |