この記事は、IE9 より前のバージョンの JavaScript のメモリ リーク問題をまとめたもので、興味のある方はそれについて学ぶことができます。
IE9 より前のバージョンでは、JScript オブジェクトと COM オブジェクトに対して異なるガベージ コレクション ルーチンが使用されるため (COM オブジェクトは「参照カウント」コレクション戦略を使用します)、これらのバージョンの IE ではクロージャーによっていくつかの特別な問題が発生します。具体的には、HTML 要素がクロージャのスコープ内に格納されている場合、その要素は破棄できないことを意味します。
次の例を見てください:
function assignHandler() { var elem = document.getElementById('elem_id'); elem.onclick = function(evt) { alert(elem.id); }; }
上記のコードは、elem 要素のイベント ハンドラーとしてクロージャを作成し、このクロージャは循環参照を作成します。無名関数は assignHandler() のアクティブオブジェクトへの参照を保存するため、elem の参照数を減らすことはできません。無名関数が存在する限り、elem の参照番号は少なくとも 1 であるため、それが占有するメモリが再利用されることはありません。
上記のコードは、わずかな変更で解決できます:
function assignHandler() { var elem = document.getElementById('elem_id'); var elem_id = elem.id; elem.onclick = function(evt) { alert(elem_id); }; elem = null; }
elem.id のコピーを変数に保存し、クロージャでその変数を参照することで、循環参照を排除します。ただし、この手順を実行しただけではメモリ リークの問題を解決できません。
「クロージャは、elem を含む、関数を含むアクティブ オブジェクト全体を参照します。クロージャが elem を直接参照しない場合でも、参照は関数を含むアクティブ オブジェクトに保存されます。したがって、次のことが必要です。 elem を null に設定すると、DOM オブジェクトへの参照が解放され、参照の数がスムーズに削減され、占有されていたメモリが適切に再利用されます。」
上記は、私が皆さんのためにまとめたものです。 . 今後のお役に立てれば幸いです。
関連記事:
JavaScript hasOwnProperty() 関数 (画像とテキストのチュートリアル、コード例付き)
JavaScript の for in ループは hasOwnProperty と組み合わせて使用されます
JavaScript の使用の違いisPrototypeOf と hasOwnProperty (実用的)
以上がIE9 より前のバージョンにおける JavaScript のメモリ リークの問題 (詳細な概要)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。