首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery 1.5内存泄漏在IE8中

jQuery 1.5内存泄漏在IE8中
EN

Stack Overflow用户
提问于 2011-02-03 20:38:54
回答 1查看 2K关注 0票数 1

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

代码语言:javascript
复制
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,那么它也不会泄漏。当我调用.remove()时,就好像.remove()保存了对条目的引用,而.remove()则包含对.elem的引用。有什么想法吗?如您所见,我已经将wrappedListener设置为null,以防止任何不经意的闭包,但这没有帮助。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-23 11:54:10

结果表明,如果发生了基于闭包的内存泄漏(在我的示例中使用"var item = {};"),则detachevent将不会发出javascript/DOM循环引用已被破坏的信号。必须手动使对元素的引用为空。为什么调用remove()似乎会使事情处于这种状态,原因一直没有确定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4891449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档