3

私がそのような「魔法の」機能を持っているとしましょう...(魔法は説明されます)

var arr = ['hello','I','am','in','an','array'];  

(function() {
    var z = document.getElementById('z');
    //before edit: a = arr;

    //let's leak memory... for fun!
    z.onclick = function () {
        var something = ...; //something, the uglier the better :P
        //before edit: a.push(something);
        arr.push(something);
        something = null;  
    };

    //now lets say by doing so I 'magically' fix my memory leak
    //before edit: a = z = null;
    z = null; 
}());

しかし、代わりにこれを行うとしたらどうなりますか...

//instead of a = z = null;
return null;  

nullを自己呼び出し関数に戻すと、すべてのローカル変数(a、z)がガベージコレクション用にマークされますか、それともブラウザー内で参照が残っているため、メモリを消費しますか?

注:私は、とりわけie7のようなレガシーブラウザを考慮に入れようとしています。また、私は自分自身にJavaScriptを教えようとしているので、これはあまり意味がないかもしれません。

4

1 に答える 1

4

クロージャ関数を onclick にバインドしたためです。「var a」に関連付けられたメモリは、onclick ハンドラを解放するまで維持されます。

  1. 「var a」を null に設定しない場合でも、「var a」はグローバル オブジェクト「arr」のみを参照するため、「var a」に関連付けられたメモリは重要ではありません。
  2. 'var z' を null に設定しても効果はありません。
  3. クロージャで 'var a' の使用を避けることができれば、'var a' は解放されます。
  4. クリックが発生すると、「var a」が null であるため、関数は実行時エラーを取得します。
  5. 関数から null を返しても、メモリ使用量には意味がありません。
于 2012-12-19T11:50:09.777 に答える