[英]Why does this code cause a memory leak in JavaScript?
<!doctype html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script>
function Frame(){
this.divs=[];
this.extra = new Array(2000);
}
Frame.prototype.reloadMapMarker = function(){
//appendMapMarker2();
appendMapMarker1();
};
function divClick(){
}
//a big surprise!!!
function appendMapMarker1(){
var div = document.getElementById('test');
$(div).empty();
var frag=document.createDocumentFragment();
for(var i=0; i<100; i++){
var newDiv=document.createElement('div');
newDiv.onclick = divClick;
newDiv.innerHTML = String(i);
frag.appendChild(newDiv);
frame.divs.push(newDiv);
}
div.appendChild(frag);
}
//less memory leak
function appendMapMarker2(){
var div = document.getElementById('test');
var str = [];
for(var i=0; i<100; i++){
str.push('<div onclick="divClick()" style="margin:2px;border:1px solid #eee;">',i,'</div>');
frame.divs.push(div.children[div.children.length-1]);
}
div.innerHTML = str.join('');
}
var frame =new Frame();
window.onload=function(){
setInterval(frame.reloadMapMarker,100);
};
</script>
</head>
<body>
<div id="test"></div>
</body>
appendMapMarker1和appendMapMarker2都會導致內存泄漏,但是appendMapMarker2比appendMapMarker1更好。
您能告訴我為什么這段代碼會導致內存泄漏,為什么appendMapMarker2比appendMapMarker1更好?
您的內存泄漏非常明顯。 您在frame.divs
數組中放入了“無限”個元素。 因此,每次調用appendMapMaker *函數時, frame.divs
重置frame.divs
數組。 基本上是這樣的:
function appendMapMarker*() {
frame.divs = [];
// ....
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.