ホームページ >ウェブフロントエンド >jsチュートリアル >jsのメモリリーク_javascriptスキルの好例

jsのメモリリーク_javascriptスキルの好例

WBOY
WBOYオリジナル
2016-05-16 17:10:121193ブラウズ

他の人の例を変更して、このようにコンパクトになったと思います。他の人の言葉を言い換えると、DOM オブジェクトに Js オブジェクト (イベント ハンドラーなど) への参照が含まれており、この Js オブジェクトが DOM オブジェクトへの参照を保持している場合、循環参照で十分であるため、ie の下でメモリ リークが発生しました。 。 [コードの実行] をクリックしてタスク マネージャーを開き、メモリの変更を確認します。 ie8 と ff でそれぞれテストしましたが、違いは言うまでもありません。

コードを実行します

コードをコピーします コードは次のとおりです:


<タイトル<スタイル< ;
ボディ {
パディング: 10px;
} <&> & lt;/style>


<script><br> var q = [];<br> var n = 0 ;<br> setInterval(function(){<br> q.push(makeSpan());<br> if (q.length>=10){<br> var s = q.shift();<br> if(s){<br> s.parentNode.removeChild(s);<br> }<br> }<br> n ;<br> },10);<br><br> function makeSpan(){<br> var s = document.createElement("span");<br> document.body.appendChild(s); <br> var t=document.createTextNode("*** " n " ***");<br> s.appendChild(t);<br> s.onclick=function(e){<br> s. style.backgroundColor="red";<br>alert(n);<br> } ;<br> return s;<br> };<br> </script>




では、IE でこれを解決するにはどうすればよいでしょうか?
ノードを削除するときは、手動で循環参照を解除し、setInterval コードを次のようにわずかに変更します。


コードをコピーしますコードは次のとおりです:setInterval(function(){
q.push(makeSpan());
if(q.length>=10){
var s = q.shift();
if(s){
s.onclick = null;//キーはここにあります
s.parentNode.removeChild(s);
}
}
n ;
},10);


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。