jQuery 1.5 IE8中的内存泄漏

我相信我可能在最新版本的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,它也不会泄漏。 当我调用.remove()时,就好像jQuery持有对item的引用一样,反过来,它持有对.elem的引用。 有什么想法吗? 正如您所看到的,我已将wrappedListener设置为null以尝试防止任何无意的关闭,但这没有帮助。

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

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

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