ホームページ  >  記事  >  ウェブフロントエンド  >  IE9以前のバージョンにおけるJavaScriptのメモリリーク問題をまとめます

IE9以前のバージョンにおけるJavaScriptのメモリリーク問題をまとめます

青灯夜游
青灯夜游転載
2018-10-09 14:38:171982ブラウズ

この記事は、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 の参照番号は少なくとも 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 ビデオ チュートリアルをご覧ください。

関連する推奨事項:

php 公共福祉トレーニング ビデオ チュートリアル

JavaScript グラフィック チュートリアル

#JavaScript オンライン マニュアル

以上がIE9以前のバージョンにおけるJavaScriptのメモリリーク問題をまとめますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。