这是一个死简单的网页,它使用jQuery泄漏IE8中的内存(我通过观察我的iexplore.exe进程的内存使用量在Windows任务管理器中随着时间的推移而检测到内存泄漏):
<html>
<head>
<title>Test Page</title>
<script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<script type="text/javascript">
function resetContent() {
$("#content div").remove();
for(var i=0; i<10000; i++) {
$("#content").append("<div>Hello World!</div>");
}
setTimeout(resetTable, 2000);
}
$(resetContent);
</script>
<div id="content"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
显然即使在调用jQuery.remove()函数时我仍然会遇到一些内存泄漏.我可以编写自己的删除函数,不会发生内存泄漏,如下所示:
$.fn.removeWithoutLeaking = function() {
this.each(function(i,e){
if( e.parentNode )
e.parentNode.removeChild(e);
});
};
Run Code Online (Sandbox Code Playgroud)
这很好用,不泄漏任何内存.那为什么jQuery会泄漏内存呢?我创建了另一个基于的删除函数jQuery.remove(),这确实会导致泄漏:
$.fn.removeWithLeakage = function() {
this.each(function(i,e) {
$("*", e).add([e]).each(function(){
$.event.remove(this);
$.removeData(this);
});
if (e.parentNode)
e.parentNode.removeChild(e);
});
};
Run Code Online (Sandbox Code Playgroud)
有趣的是,内存泄漏似乎是由jQuery包含的每个调用引起的,以防止事件和与删除的DOM元素相关的数据的内存泄漏.当我调用该removeWithoutLeaking函数时,我的记忆会随着时间的推移而保持不变,但是当我打电话时removeWithLeakage它会继续增长.
我的问题是,每个电话怎么样
$("*", e).add([e]).each(function(){
$.event.remove(this);
$.removeData(this);
});
Run Code Online (Sandbox Code Playgroud)
可能是导致内存泄漏?
编辑:修复了代码中的拼写错误,经过重新测试,证明对结果没有影响. …