閉鎖is「スタックフレームが」のではなく、ヒープ に割り当てられたかのように関数は(その実行を開始し、 関数が戻った後解放されていない場合、割り当てられクロージャ(Javascriptで)はスタックの断片化を引き起こす可能性がありますか?
あるスタックフレームの場合stack!)、
スタックが断片化する可能性はありませんか?例えば
、FOO()が呼び出され、その後呼ばれる()バー。どちらもクロージャーです。 foo()のクロージャをスコープ外に出すか、さもなければ解放の候補にするシナリオはありますか(スタックの場合の割り振り解除は単にランタイムがスタックポインタを戻してスペースを解放することを意味します) bar()はスタック上にスペースを必要とし続けますか?このようなイベントが繰り返し発生した場合
、その後、ヒープの断片化の相当スタックがどのように動作するかの性質上ことを除いて、スタック上に起こるであろう、スペースが失われてしまいます。明らかにこれは起こらない。それは何が起こるのを止める?
私は具体的には、1つのコードを実行しているマシンのも、大まかなアイデアを持っていませんが、質問は任意の関数型言語に適用されたJavaScriptの文脈に興味があります。堅実質問を作るための努力で
...
は、次のサンプル・コードを考えてみましょう。
outer = function() {
var foo = function(v) {
return function() { return v; }
}
var bar = function(w) {
return function() { return w; }
}
var f = foo(5);
var b = bar(7);
document.writeln(f());
document.writeln(b());
document.writeln(f());
document.writeln(b());
}
outer();
イベントのシーケンス:外側()が呼び出されます。その戻りアドレスはスタックに保存されます。 foo
,bar
,f
およびb
はすべて吊り上げられ、したがってouter()
が呼び出されるとすぐにスタックに割り当てられます。パラメータ5
でfoo()
が呼び出されます。 foo()
関数へのパラメータは、ローカル変数と同様に、スタックにも割り当てられます。関数foo()
は、スタックを経由しても匿名関数を返します。同じイベントのペアがb
とbar
で発生します。私は、foo()
の中の無名関数は、それを囲むスコープ内の変数を参照するので、クロージャであると考えていますが、セマンティクスとクロージャは何も気にしません。私の質問は、b
とbar()
が生きている間にf
とfoo()
が脱着できなかったことをどうやって知っているのでしょうか?
引用文が完全に不正確です。それを信じてはいけません。 – Bergi
これは助けになるかもしれませんhttps://stackoverflow.com/questions/33802718/closures-and-es2015 – Ben
いくつかのJavaScriptエンジンは最適化を実行し、いくつかの変数がスタックに保存される可能性があります** so:https://stackoverflow.com/q/26150468/5217142 – traktor53