我正在阅读有关内存泄漏的信息,因为当我从IBM看到这篇文章时,我的站点的内存一直在堆积:
http://www.ibm.com/developerworks/web/library/wa-memleak/#N10116
闭包和循环引用
在清单5中,您可以看到一个闭包,其中JavaScript对象(obj)包含对DOM对象的引用(由id“ element”引用)。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>
一个解决方案,他们给被设置obj
到null
在的结束onload-function
。
(请参阅有人可以向我解释此javascript内存泄漏情况,以获取有关为什么会造成内存泄漏的说明)
现在,我很可能会在这里遗漏一些东西,这就是问题所在,但这不是当您添加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
里面的基本相同window.load-function
,对吗?
我知道您没有创建一个var obj
,但是代码仍然创建了一个jQuery对象。
我是否真的在每个添加的jQuery处理程序中添加了内存泄漏?
还是我完全误解了这两种情况?
当我从IBM遇到这篇文章时,我正在阅读内存泄漏的信息:http : //www.ibm.com/developerworks/web/library/wa-memleak/#N10116
那篇文章来自2007年。算了。循环引用越过DOM边界时遇到问题的浏览器会长时间死机。
我知道您不会创建
var obj
,但是代码仍会创建一个jQuery对象。
如果没有该变量,该函数将不会在对象上关闭,因此不会创建循环引用。无论如何,jQuery通过一种针对DOM元素未直接引用处理程序的古老浏览器的解决方法解决了此问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句