ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript Closure_JavaScript スキルによって引き起こされる IE メモリ リークの分析

Javascript Closure_JavaScript スキルによって引き起こされる IE メモリ リークの分析

WBOY
WBOYオリジナル
2016-05-16 17:53:261067ブラウズ
コードをコピー コードは次のとおりです。

function fors(){
obj_a = obj_b;
obj_b.attr = obj_a;
}

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

function fors(){
obj_b = {};
obj_b.attr = obj_b;
}

上記は 2 つです。明らかな循環参照。IE のメモリ リサイクル メカニズムによりメモリ リークが発生し、メモリが長時間占有され、解放できなくなります。

しかし、クロージャのメモリリークは多少隠されています。クロージャの循環参照は間接的であるためです。
コードをコピー コードは次のとおりです。

function iememery(){
var js_obj = document .createElement("div");
js_obj.oncontextmenu = function(){ return false;}
}
>
表面的には、循環参照はありません。ただし、上記はクロージャです。クロージャの特性により、内側の関数は外側の関数の変数オブジェクトにアクセスする権利を持ちます。したがって、iememery() が実行されると、次のようになります。
js_obj は DOM 要素への参照です。DOM 要素は Web ページに長期間残り、この DOM 要素の属性である oncontextmenu も内部属性です。関数参照 (クロージャ) であり、この匿名関数は js_obj との隠れた関連付け (スコープ チェーン) を持っています。つまり、循環参照が形成されます。
js_obj.oncontextmenu は間接的に js_obj を参照します。つまり、循環参照です。このオブジェクトの属性を定義し、それ自体を間接的に参照します。
循環参照がある限り、IE ではメモリ リークが発生します。 Windows タスク マネージャーを開き、IE でこのコードを含む HTML ページを更新し続けて、Iexploer プロセスのメモリ使用量が増加し続け、自動的にリサイクル (削減) されないかどうかを確認します。
解決策:



コードをコピーします コードは次のとおりです: function iememery(){
var js_obj = document。 createElement("div");
js_obj.oncontextmenu = function(){ return false;}; js_obj.oncontextmenu = null;//この文を追加して参照を中断します。


IE では js オブジェクトと dom オブジェクトの間の直接循環参照が発生し、その後それらへの参照はありません。
IE 6 の場合、IE プロセスが終了するまでメモリ リークが発生します。
IE 7 の場合、現在のページを離れるまでメモリ リークが発生します
IE 8 の場合、現在互換モードであるかどうかに関係なく、GC コレクターはメモリを再利用します。
以前の IE js エンジンの GC コレクターは、DOM オブジェクトではなく、js オブジェクトのみを処理できました。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。