ホームページ > ウェブフロントエンド > jsチュートリアル > IE9 より前のバージョンでの JS メモリ リークに対処する方法

IE9 より前のバージョンでの JS メモリ リークに対処する方法

php中世界最好的语言
リリース: 2018-06-01 17:24:51
オリジナル
1304 人が閲覧しました

今回は、IE9 以前のバージョンの JS でメモリ リークが発生した場合の対処方法と、IE9 より前のバージョンで JS でメモリ リークが発生した場合の注意事項について説明します。実際のケースを見てみましょう。

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 を直接参照しない場合でも、参照は関数を含むアクティブ オブジェクトに保存されます。したがって、次のことが必要です。 set elem to null このようにして、

DOM オブジェクト への参照を解放し、その参照の数をスムーズに減らし、それによって占有されているメモリを適切にリサイクルすることができます。」

この記事の事例を読んだ後は、その他の関連記事を参照してください。

推奨読書:

vue.extend を使用してアラート モーダル ボックス ポップアップ コンポーネントを実装する方法

vue ポップアップ メッセージ コンポーネントの使用方法

以上がIE9 より前のバージョンでの JS メモリ リークに対処する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート