关于jquery,闭包和可能的内存泄漏

Eri*_*rik 5 jquery internet-explorer memory-leaks

我已经阅读了很多关于如何在各种版本的IE中创建内存泄漏的内容.一些很棒的信息可以在这里找到:

http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

http://laurens.vd.oever.nl/weblog/items2005/closures/

使用JQuery的闭包是一种非常常见的做法.关于IE和内存泄漏,我找不到任何与JQuery的事件模型(大量使用关闭)有关的文章.上面发布的第二篇文章是一种在使用闭包时避免内存泄漏的策略.

JQuery是否已经实施了类似于文章中概述的策略,以帮助清理使用闭包时潜在的泄漏?或者是我必须注意和代码的东西?

例如,

在IE6/7中创建内存泄漏:

function foo(value) {   
    var bar = document.getElementById("selector");
    bar.attachEvent("onclick", 
        // closure
        function() {
            alert(value); // reference to 'value' from outer function scope   
        }
    ); 
}

以上示例的以下JQuery版本是否会导致IE6/7中的内存泄漏?

function foo(value) {   
    $('#selector').click(
        // closure
        function() {
            alert(value); // reference to 'value' from outer function scope   
        }
    ); 
}

Jav*_*ier 4

来自 jQuery 1.3 源代码:

remove: function( selector ) {
    if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
        // Prevent memory leaks
        jQuery( "*", this ).add([this]).each(function(){
            jQuery.event.remove(this);
            jQuery.removeData(this);
        });
        if (this.parentNode)
            this.parentNode.removeChild( this );
    }
},
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它在删除元素及其子元素之前删除所有事件处理程序和相关数据。

  • 问题中没有任何关于调用 .remove() 方法的问题。 (3认同)
  • 当您删除具有事件处理程序的 DOM 对象时,就会出现众所周知的 IE 泄漏问题,该事件处理程序可以是保存对同一 DOM 对象的引用的闭包。解决方案是先从 DOM 对象中删除所有事件处理程序,然后再将其从 DOM 树中删除。jQuery 的 .remove() 方法正是这样做的。 (3认同)