首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jQuery的事件处理会导致内存泄漏吗?

jQuery的事件处理会导致内存泄漏吗?
EN

Stack Overflow用户
提问于 2016-08-24 16:40:57
回答 1查看 1.2K关注 0票数 2

当我看到IBM的这篇文章时,我正在阅读内存泄漏的信息,因为我的站点的内存不断堆积:

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

闭包和循环引用 在清单5中,您可以看到一个闭包,其中JavaScript对象(obj)包含对DOM对象的引用(由id“元素”引用)。DOM元素反过来具有对JavaScript obj的引用。由此产生的JavaScript对象和DOM对象之间的循环引用会导致内存泄漏。 清单5.事件处理内存泄漏模式:

代码语言:javascript
运行
复制
<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事件处理程序时,这不是也会发生吗?

代码语言:javascript
运行
复制
<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处理程序添加了一个内存泄漏?

还是我完全误解了这两种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 16:49:35

当我看到IBM:http://www.ibm.com/developerworks/web/library/wa-memleak/#N10116的这篇文章时,我正在阅读内存泄漏。

那篇文章是2007年写的。休想。跨越DOM边界的循环引用出现问题的浏览器已经死了很长时间。

我知道您没有创建var obj,但是代码仍然创建一个jQuery对象。

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

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

https://stackoverflow.com/questions/39128807

复制
相关文章

相似问题

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