私は長い間JavaScriptと連絡を取り合ってきましたが、閉鎖を理解するたびに、最近Webのフロントエンドでの作業を探しているので、財団を統合する必要があります。
この記事では、彼女のブログに基づいてJoy_leeのブログの閉鎖に言及し、コメントの形で私の理解を説明するよう努めています。不適切なものがある場合、批判と修正が歓迎されます。
高度なプログラミングでは、これが言われています。関数内で他の関数が定義されると、閉鎖が作成されます。閉鎖には、関数内に含まれるすべての変数にアクセスする許可があります。
(この文をどのように理解しますか?この文によると、閉鎖はネストされた関数です!もちろん、ネストされた関数はそれを含む関数の変数にアクセスでき、問題はありません。)
一般的に、内部関数は、前のレベルまたはグローバルレベルで変数にアクセスできます。したがって、一部の人々はこれを理解しています。閉鎖を通じて、ローカル関数内の変数への外部アクセスを達成できます。
(スコープを1つのレベルに単純に分割するだけで、グローバルスコープを第1レベルとして、定義された関数本体の内部スコープが2番目のレベルであり、定義された関数本体の内部スコープが第3レベルとして第2レベルの範囲内でネストされていると仮定します。1つ目のレベルは第2レベルの変数にアクセスできません(この変数はローカル変数と呼ばれます)。このレベルの範囲は、閉鎖メカニズムが第1レベルの範囲で第2レベルの範囲を介して変数を参照することができます。このような参照がない場合は、閉鎖が機能している場合は、ネストされた機能を参照していますか?
関数a(){var i = 0; function b(){alert(++ i); } burten b; } var c = a(); c();つまり、閉鎖の機能は、Aが実行されて返された後、閉鎖によりJavaScriptのガベージコレクションメカニズムがAが占有するリソースを回収しないことです。
閉鎖の存在のため、関数Aの戻り後、私は常に存在します。このようにして、C()が実行されるたびに、私は1を追加した後に警告された私の値です。
次に、Aが関数Bを返さない場合、状況は完全に異なります。 Aが実行された後、BはAの外側の世界に戻さず、Aによってのみ参照されるため、AはBによってのみ参照されるため、機能は互いに参照されますが、外の世界(外の世界で参照)は妨害されません。
実際、変数のライフサイクルを延長するのは閉鎖です。通常、関数の範囲、つまり変数は関数の実行後に破壊されますが、閉鎖がリリースされない限り、関数が閉鎖を返すと、スコープチェーン全体がメモリを占有します。 (閉鎖は変数のライフサイクルを延長します。これは、最初のレベルで参照される場合を指します。しかし、この参照がなければ、閉鎖はまだ閉鎖と呼ばれますか?)
スコープチェーンと言えば、つまり、関数独自の範囲、以前のレイヤーの関数の範囲...およびグローバル範囲。変数にアクセスするときは、持っていない場合は、全世界までレイヤーごとに見てください。まだお持ちでない場合は、エラーを報告します。
(私は本当に閉鎖のスコープチェーンが湾曲していると不平を言いたいです。)
PS:一部のネチズンは、JavaScriptの閉鎖の概念を分析するために別の記事を推奨しました。それは権威がありますか?最後に、明確な概念があります。
そんなに言ったが、閉鎖とは正確には何ですか?以下に要約しましょう。
閉鎖は、関数の実行がリリースされた後にメモリが存在する現象を説明する概念です。このコアコンセプトを把握している限り、閉鎖を理解するのは難しくありません。
上記の記事では、1つの文で閉鎖を理解することができます(シンプルで理解しやすい)は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。