jQuery 1.5 IE8中的内存泄漏

时间:2011-02-03 20:38:55

标签: jquery memory internet-explorer-8 memory-leaks

我相信我可能在最新版本的jQuery中发现了一个相当简单的漏洞。

var  listen = function(){};
var testLeak = function(){
    for(var i = 0; i<100; i++){
        var item = {};
        item.elem = $(document.createElement('div'));
        item.addListener = function(name,listener){
            var self = this;
            var wrappedListener = function(){
                return listener.apply(self,arguments);
            }
            this.elem.bind(name, wrappedListener);
            wrappedListener = null;
        }
        item.addListener('eventName',listen );
        item.elem.unbind();
        item.elem.remove();  //with this un-commented, the loop leaks
        // item.elem = null; //with this also un-commented, the leak dissapears
    }
};

$(document).ready(function(){
    setInterval(testLeak, 100);
}

我在jsfiddle上创建了一个项目来演示:

http://jsfiddle.net/rJ8x5/8/

重要的是要注意,如果我调用.remove(),这不会泄漏,如果我调用.remove()但是将.elem引用设置为null,它也不泄漏。就好像jQuery在调用.remove()时持有对item的引用,而这反过来又持有对.elem的引用。 有什么想法吗? 如您所见,我已将wrappedListener设置为null以尝试防止任何意外关闭,但这没有帮助。

编辑:我更新了jsfiddle脚本以实际将节点添加到DOM。这会影响行为

EDIT2:已经找到了问题的解决方案,但是我仍然不清楚为什么只有当你包含对remove()的调用时这个脚本才会泄漏。仍然希望得到答案......

1 个答案:

答案 0 :(得分:0)

事实证明,如果基于闭包的内存泄漏(就像在我的示例中使用&#34; var item = {};&#34;),detachevent将不会发出javascript / DOM循环引用的信号已被打破。您必须手动取消对元素的引用。为什么调用remove()似乎让事情进入这种状态从未确定