2016-08-24 38 views
2

我读了关于内存泄漏因为我的网站的内存不断堆积,当我遇到这篇文章来自IBM:jQuery的事件处理会导致内存泄漏吗?

http://www.ibm.com/developerworks/web/library/wa-memleak/#N10116

闭包和循环引用
在清单5您会看到一个JavaScript对象(obj)包含对DOM对象的引用(由id“元素”引用)的闭包。 DOM元素反过来对JavaScript obj有一个引用。 JavaScript对象和DOM对象之间产生的循环引用导致内存泄漏。

清单5.事件处理内存泄漏模式:

<html> 
<body> 
<script type="text/javascript"> 
document.write("Program to illustrate memory leak via closure"); 
window.onload=function outerFunction(){ 
    var obj = document.getElementById("element"); 
    obj.onclick=function innerFunction(){ 
    alert("Hi! I will leak"); 
    }; 
    obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX")); 
    // This is used to make the leak significant 
}; 
</script> 
<button id="element">Click Me</button> 
</body> 
</html> 

的一个解决方案,他们给,在onload-function的端部被设置到objnull

(见Can someone explain this javascript memory leak scenario to me用于解释为什么这将创建一个内存泄漏)


现在,我很可能失去了一些东西,因此这个问题,但不是这个也是会发生什么当您添加一个jQuery的事件处理程序:

<html> 
<body> 
<script type="text/javascript"> 
$(window).load(function() { 
    $("element").on("click",function() { 
     alert("Will this also leak?"); 
    }); 
}; 
</script> 
<button id="element">Click Me</button> 
</body> 
</html> 

你有基本内同一click-handler,对不对?
我知道你不会创建var obj,但代码仍会创建一个jQuery对象

我真的添加了一个内存泄漏与我添加的每个jQuery处理程序?
还是我完全误解了这两种情况?

+0

没有答案,但会推荐阅读https://developers.google.com/web/tools/chrome-devtools/profile/memory-problems/memory-diagnosis?hl=en和https:// developer .chrome.com/devtools/docs/heap-profiling – juvian

+1

在他们的例子中,这是一个泄漏,但它只会发生一次。内存泄漏只是一个问题,如果它重复出现。即如果你有(说)基于网络的聊天,并且你的更新消息窗口的方法导致泄漏,那么是的,当消息进入时你最终会耗尽内存。但是如果一个可泄漏事件只发生在一次页面的生命周期,那么它不会是一个问题。 –

+1

该文章来自2007年。忘记它。浏览器在跨越DOM边界的循环引用中出现问题已经很长时间了。 – Bergi

回答

1

我对内存读了泄漏,当我遇到这篇文章来自IBM:http://www.ibm.com/developerworks/web/library/wa-memleak/#N10116

这篇文章是从2007年开始算了。浏览器在跨越DOM边界的循环引用中出现问题已经很长时间了。

我知道你不会创建var obj,但代码仍然会创建一个jQuery对象。

而且没有变量,函数不会关闭对象,因此不会创建循环引用。无论如何,jQuery已经通过解决这个问题的方法解决了那些DOM元素没有直接引用处理程序的古老浏览器。

+0

谢谢,这让我放心!特别是第二部分是有帮助的 – myfunkyside

+0

关于您对文章日期的评论..我不会让它超过微软在IE中保持这样的缺陷,只是因为它们很厚实,并且实际上逃避了它,不??:) – myfunkyside