2017-07-12 8 views
0

閉鎖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(); 

stack and heap

イベントのシーケンス:外側()が呼び出されます。その戻りアドレスはスタックに保存されます。 foo,bar,fおよびbはすべて吊り上げられ、したがってouter()が呼び出されるとすぐにスタックに割り当てられます。パラメータ5foo()が呼び出されます。 foo()関数へのパラメータは、ローカル変数と同様に、スタックにも割り当てられます。関数foo()は、スタックを経由しても匿名関数を返します。同じイベントのペアがbbarで発生します。私は、foo()の中の無名関数は、それを囲むスコープ内の変数を参照するので、クロージャであると考えていますが、セマンティクスとクロージャは何も気にしません。私の質問は、bbar()が生きている間にffoo()が脱着できなかったことをどうやって知っているのでしょうか?

+0

引用文が完全に不正確です。それを信じてはいけません。 – Bergi

+0

これは助けになるかもしれませんhttps://stackoverflow.com/questions/33802718/closures-and-es2015 – Ben

+0

いくつかのJavaScriptエンジンは最適化を実行し、いくつかの変数がスタックに保存される可能性があります** so:https://stackoverflow.com/q/26150468/5217142 – traktor53

答えて

1

ええ。

閉鎖スタックフレームである...

号クロージャは、変数をルックアップする必要が外部スコープオブジェクトへの参照を有する機能あります。

スタックフレームは、ファンクションが実行

はい開始時に割り当てられています。スタックフレームは(戻りアドレスのようなもののほかに)宣言された変数を持つスコープオブジェクトを含んでいます。むしろ、参照へ。すべての変数がスタックに割り当てられるわけではありません。関数の戻りは、スタックフレームがポップされます - 関数の後に解放され

なく、スタックの全体のポイントの

番号を返します。

(範囲はヒープではなくスタックに割り当てられたかのように!)

わからないこれは「かのよう」と言う理由。クロージャーによって参照されるスコープオブジェクトは、ヒープ上に割り当てられたです。

関連する問題