2016-05-22 12 views
3

私はスコープ/クロージャを通過するコースをやっており、ガベージコレクションについて簡単に言及しています。コース中に質問が提起されます:このスコープ/クロージャはいつJavaScriptでガベージコレクトされますか?

スコープはどれくらいの期間滞在しますか?その答えは まではもう参照できませんでした。うん、だから私たちは基本的に と言っていた、閉鎖は隠されたスコープオブジェクトへの参照のようなものでした。 スコープでクロージャがまだ残っている機能がある限り、そのスコープはそのまま残ります。しかし、閉鎖 がなくなると、スコープはガベージコレクトを取得できます。 「我々はsum関数を変数に割り当てられたとき、私にはそう

var sum = function sumHndlr(x, y) { 
    if (y !== undefined) { 
     return x + y; 
    } else { 
     return function(y) { 
      return x + y; 
     } 
    } 
} 

は、クロージャへの参照ですが、それはそれが永遠に続くか、私はJSが実行される方法を理解していないです意味はありません?非常に簡単に

+0

あなたは「永遠に」とはどういう意味ですか?はい、閉鎖は 'sum'の間続くでしょうが、それは永遠ではありません... – Djizeus

+0

ガベージコレクションで実際に起こっていることをもっと明確にする必要があります。現在、イベントリスナーを削除するときのようにガベージコレクションを考えています。たぶんあなたはそれが永遠ではない理由を説明することができます。ありがとう! –

+2

'sum' /' sumHndlr'はクロージャではありません。あなたはそれを得るために(yを使わずに)それを呼び出さなければなりません。そして、あなたがどこかに置いておく限り、その人は周りにとどまります(それを閉じる "x"と一緒に)。私たちにもっと伝えたいなら、その電話を私たちに見せてください。 – Bergi

答えて

1

などのコンパイラパーサに関しては、ガベージコレクションは、自動的に、もはやあなたのプログラムで必要なオブジェクトのメモリを解放するJavaScriptインタープリタ/仮想マシンのバックグラウンド・プロセスである。

例えば、あなたがイベントのためにそれを考えるのでリスナー:一部のイベントディスパッチャーからイベントリスナー(通常は関数)を削除すると、プログラムの他の部分にイベントリスナーへの参照がない可能性があります。したがって、ガベージコレクタは、イベントリスナーによって取得されたメモリを解放することができます(ある未知の時間に)。

クロージャがスコープオブジェクトを参照するため、クロージャをガベージコレクトするために、参照されていないだけでなく、スコープも必要です。

私は少しあなたの例を変更した場合:add10

/* some stuff ... */ 
function add10(a) { 
    var adder = function (x) { 
    return function(y) { 
     return x + y; 
    } 
    } 

    var sum = adder(10); //creates a closure 
    return sum(a); 
} 

var thirty = add10(20); 

/* Some more stuff ... */ 

は、プログラムはいくつかのより多くのものを実行し続けていても、と呼ばれ、ガベージコレクタがあるため、閉鎖sumに関連付けられたメモリを解放することができますもはや参照されていないので、もそれに関連するスコープです。

/* some stuff ... */ 
function add10AndGet20Adder(a) { 
    var adders = function (x, y) { 
    return [function(z) { 
     return x + z; 
    }, function(z) { 
     return y + z; 
    }] 
    } 

    var sums = adders(10, 20); //creates a closure 
    return [sums[0](a), sums[1]]; 
} 

var result = add10AndGet20Adder(50); 
var sixty = result[0]; 
var add20 = result[1]; 

/* Some more stuff ... */ 

いくつかのより多くのものを実行する、sums[0]がもはや参照され、BUTadd20sums[1])依然として従って、xyを参照スコープへの参照を持つなし:

この例でに対し

の2つのクロージャのsumsは、add20がプログラムによって参照されるまで、ガベージコレクタによって解放されます。

もちろん、実際のコードに近い例はありませんが、これは明確になることを望みます。実際には、閉鎖の複雑な使用法を使用して長寿命プログラム(単一ページアプリケーションやnodeJSサーバーなど)を開発する場合にのみ、これについて心配する必要があります。そうしないと、クロージャのメモリ使用量が問題になることはまずありません。

このSO質問は、JavaScriptのガベージコレクションの詳細を与える:What is JavaScript garbage collection?

+0

そのユニークな形式の関数(2番目のもの)を使用した詳細な説明をお寄せいただきありがとうございます。私はそれを見たことがないので、私にとってはユニークかもしれません;)JSガベージコレクションのリンクもチェックします!乾杯! –

関連する問題