他の人の例を修正して、このようにコンパクトになったと思います。他の人の言葉を言い換えると、DOM オブジェクトに Js オブジェクト (イベント ハンドラーなど) への参照が含まれており、この Js オブジェクトが DOM オブジェクトへの参照を保持している場合、循環参照で十分であるため、ie の下でメモリ リークが発生しました。 。 [コードの実行] をクリックしてタスク マネージャーを開き、メモリの変更を確認します。 ie8 と ff でそれぞれテストしましたが、違いは言うまでもありません。
コードを実行する
次のようにコードをコピーします。
<html>
<頭>
<title>メモリ リーク</title>
<スタイル>
体{
パディング: 10px;
}
</スタイル>
</head>
<本文>
</body>
<スクリプト>
var q = [];
var n = 0;
setInterval(関数(){
q.push(makeSpan());
if(q.length>=10){
var s = q.shift();
if(s){
s.parentNode.removeChild(s);
}
}
n++;
},10);
関数 makeSpan(){
var s = document.createElement("スパン");
document.body.appendChild(s);
var t=document.createTextNode("*** " + n + " ***");
s.appendChild(t);
s.onclick=関数(e){
s.style.backgroundColor="赤";
アラート(n);
};
を返します。
};
</script>
</html>
では、ie でそれを解決するにはどうすればよいでしょうか?
ノードを削除するときは、循環参照を手動で解除し、内部の setInterval コードを次のようにわずかに変更します。
次のようにコードをコピーします。
setInterval(関数(){
q.push(makeSpan());
if(q.length>=10){
var s = q.shift();
if(s){
s.onclick = null;//キーはここにあります
s.parentNode.removeChild(s);
}
}
n++;
},10);