1

JavaScript のメモリ リークに問題があります。

私はFirefox 用の Leak Memory 0.4.5 拡張機能を使用しています。これは、まだメモリに残っている JavaScript オブジェクトを表示します。

イベントなどから dom-object を正しくバインド解除する方法がわかりません。

たとえば、「dropdownbox」という jQuery ウィジェットがあります。destroy メソッドでは、次のようなイベント ハンドラーのバインドを解除するために必要なものをすべて作成します。

this.box.find('.toggler').unbind();
this.box.remove();
this.box = null;

この 3 行は必須ですか、それとも this.box.remove() だけを呼び出すことは可能ですか?

今日まで、DOM 要素から何かをアンバインドしたりクリアしたりしたことはありません。しかし、同じサイトで 2 時間開発した後、Firefox が 1GB を消費するという問題が発生しました。

クロージャなどを使用するときのメモリ リークを少し読みました

すべてにクロージャーを使うべきではないと言う人もいます。たとえば、次のコードがあるとします。

function foo(param1, param2) {
  var local1, local2;
  $('a').click(function() {
    alert('YEAH');
  });
}

次のようにするとよいでしょう。

funtion foo(param1, param2) {
      var local1, local2;
      $('a').click(clickEvent);
    }
function() {
  alert('YEAH');
}

それとも私はそれを誤解していますか?

4

2 に答える 2

3

これは古いトピックであることは知っていますが、クロージャーについて言及しましたが、提供した例はクロージャーではありません。関数が内部関数を返すと、閉鎖が「発生」します。この質問は「javascript メモリ リーク アンバインド イベント」の Google 検索結果の一番上にあり、間違った情報が与えられるべきではないため、人々はおそらくここを見るでしょう :) 意図的ではないことはわかっています。

優れたクロージャーの説明については、こちらをご覧ください: JavaScript クロージャーはどのように機能しますか?

于 2013-03-09T21:12:04.110 に答える
1

あなたはただ呼び出すことができます:

this.box.remove();
this.box = null;

.remove()また、子要素とそのイベントハンドラー/データも削除されます。要素に対して保持されている参照を無効にすること.boxは、完全に削除するための最後のステップです(要素にぶら下がっているものが他にないと仮定します)。

他の例では、ハンドラーがいたるところにコピーされていないため、2番目のバージョンの方が少し効率的です。ハンドラーが大きいほど、違いが大きくなります。

于 2010-09-25T17:01:30.650 に答える