当我看到IBM的这篇文章时,我正在阅读内存泄漏的信息,因为我的站点的内存不断堆积:
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>
他们给出的解决方案之一是将obj
设置为onload-function
末尾的null
。
(有关为什么会造成内存泄漏的解释,请参见https://stackoverflow.com/q/15496585/3407923 )
现在,我很可能在这里遗漏了一些东西,这就是问题所在,但是当您添加一个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>
你在window.load-function
里面有一个基本相同的window.load-function
,对吗?
我知道您没有创建var obj
,但是代码仍然创建一个jQuery对象。
我是否真的为我添加的每个jQuery处理程序添加了一个内存泄漏?
还是我完全误解了这两种情况?
发布于 2016-08-24 16:49:35
当我看到IBM:http://www.ibm.com/developerworks/web/library/wa-memleak/#N10116的这篇文章时,我正在阅读内存泄漏。
那篇文章是2007年写的。休想。跨越DOM边界的循环引用出现问题的浏览器已经死了很长时间。
我知道您没有创建
var obj
,但是代码仍然创建一个jQuery对象。
如果没有变量,函数就不会关闭对象,因此不会创建循环引用。无论如何,jQuery已经为那些DOM元素不直接引用处理程序的旧浏览器解决了这个问题。
https://stackoverflow.com/questions/39128807
复制相似问题