2017-12-15 3 views
0

私は現在、クロージャがどのようなもので、どのように機能しているかを見ています。クロージャを見るためには、基本的にサブオブジェクト、つまり親オブジェクトの一部または子です。JavaScriptのクロージャをサブオブジェクトのように動作させることができますか?

クロージャは、別の関数内に存在する関数であり、これは、この関数が親関数の他のものと同様に、親関数によって返されることを意味します。

関数を返す際の問題は、親オブジェクトのスコープ内で作成されているため、スコープ内の特定のリソースへのアクセスが必要な場合があるためです。

何かが関数(つまりオブジェクト)から参照渡しされた場合、コード内に参照が残っていない限り、それを削除することはできません。

ガベージコレクションが発生すると、メモリに残っているものを調べ、不要なものはマークされ、効果的に削除され、メモリスペースが解放されます。コード、内部変数、親変数、パラメータなど(関数が必要とする範囲内のもの)のように、クロージャが必要とするものはすべてそこに残されます。これらのものがもはや必要なくなったら、後でいつでもガベージコレクタによってマークされ削除されます。

基本的にクロージャは、返された関数とそのスコープから必要なものを含むサブオブジェクトであり、残りのオブジェクトは参照/必要がないため削除されます。最後に、ある時点で、コードがもはやサブオブジェクト/クロージャを必要としなくなると、それは効果的に参照されないとマークされ、メモリから除去される。

これはおおよそ/概念的に正しいと思いますか?

+0

この質問は、コンピュータサイエンスの交換により適している可能性があります。https://cs.stackexchange.com/ – ControlAltDel

答えて

0

はい、大したことですが、わずかな変更があります。サブオブジェクトとは考えないでください。それを単なるオブジェクトと考えるが、それは必要なものを捕らえることができる。あなたが言ったのと全く同じように、ある関数の範囲内でクロージャが定義され、その関数のローカルメンバーが使用されている場合、クロージャはそれらの値を「キャプチャ」します。これは、カウンターなどを扱うときに多くの人を動かし、他の関数からの変数のローカルインスタンスをエスケープしていることを理解していないことを意味しません。

しかし全体的に見ても、あなたの一般的な理解はかなり正しいです。

+0

Hey @MarqueIV。あなたの入力をありがとう!:)私は「エスケープされた」変数のローカルインスタンスの観念が好きです。おそらく、彼らは「不正」と呼ばれるべきです;)すべてのアカウントのクロージャは、それらを使用する方法を知っていれば祝福になります。あなたがしなければ呪いのビット;)再びありがとう、常にこれらの事柄について第二意見を持って良い。 – TheLemonSong

+0

問題ありません!ちょうど覚えています...最も簡単な説明では、クロージャーは変数に格納したり引数として渡したりすることができる関数(関数のシグネチャと 'guts')です。他の名前付き関数を呼び出すのと同じ方法で、変数/引数から呼び出すことができます。あなたは、同じ署名がある限り、名前付き関数をクロージャが必要な場所に渡すこともできます。 C++の関数ポインタの欠点がなくても、本当に役に立つ/強力なものです。 – MarqueIV

関連する問題