などのコンパイラパーサに関しては、ガベージコレクションは、自動的に、もはやあなたのプログラムで必要なオブジェクトのメモリを解放する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]
がもはや参照され、BUTadd20
(sums[1]
)依然として従って、x
とy
を参照スコープへの参照を持つなし:
この例でに対し
の2つのクロージャのsums
は、add20
がプログラムによって参照されるまで、ガベージコレクタによって解放されます。
もちろん、実際のコードに近い例はありませんが、これは明確になることを望みます。実際には、閉鎖の複雑な使用法を使用して長寿命プログラム(単一ページアプリケーションやnodeJSサーバーなど)を開発する場合にのみ、これについて心配する必要があります。そうしないと、クロージャのメモリ使用量が問題になることはまずありません。
このSO質問は、JavaScriptのガベージコレクションの詳細を与える:What is JavaScript garbage collection?
あなたは「永遠に」とはどういう意味ですか?はい、閉鎖は 'sum'の間続くでしょうが、それは永遠ではありません... – Djizeus
ガベージコレクションで実際に起こっていることをもっと明確にする必要があります。現在、イベントリスナーを削除するときのようにガベージコレクションを考えています。たぶんあなたはそれが永遠ではない理由を説明することができます。ありがとう! –
'sum' /' sumHndlr'はクロージャではありません。あなたはそれを得るために(yを使わずに)それを呼び出さなければなりません。そして、あなたがどこかに置いておく限り、その人は周りにとどまります(それを閉じる "x"と一緒に)。私たちにもっと伝えたいなら、その電話を私たちに見せてください。 – Bergi