この記事では主に JavaScript クロージャについて詳しく紹介します。 クロージャといえば、フロントエンドを書く学生なら誰もが知っていると思いますし、実際のプロジェクトでも多かれ少なかれ使用されていると思います。では、クロージャとは正確には何ですか?また、クロージャはどのようにして発生するのでしょうか?
1. クロージャとは何ですか?
先生の記事で述べられています:
クロージャは、他の関数の内部変数を読み取ることができる関数です。 Javascript言語ではローカル変数を読み込めるのは関数内のサブ関数のみであるため、クロージャは単純に「関数内で定義された関数」として理解できます。
2.クロージャの機能
1つは関数内の変数を読み取ることであり、もう1つはこれらの変数の値をメモリに保持することです。
3. 簡単なクロージャの例
function count() { let num = 0; return function add() { return ++num; } }let a = count(); a(); //1a(); //2
まず、count() 関数で返される関数である count() の戻り結果を a に代入します。このとき、count()で定義したローカル変数numがメモリに保存されます。初めて a() を呼び出すと ++num が返され、これは 1 です。2 回目に a() を呼び出すと、この時点では num が 1 であるため、返される結果は 2
4 になります。クロージャの生成 その理由
多くの人がこの問題について混乱していると思います。関数が関数を返すことでクロージャが形成されると考えています。実際、これは単なる閉鎖方法であり、理由は以下で説明されます。
主な理由は、JavaScript が字句的にスコープ化されている、つまり、関数 が定義されるときにスコープが与えられているためです 。その後、実行時に、実際の実行状況に基づいて実行時スコープが割り当てられます。これら 2 つのスコープを通じてのみ、JS 関数を正しく実行できます。
上記の例を例に挙げます。 count() が実行されるとき、関数のスコープは
runtimescope num = 0 |
---|
lexicalscope |
when count() です。実行時、add 関数が返されるとき、この時点で add は 定義 状態にあるため、返されるときに生成される関数の字句スコープは上記の count() のスコープになります。したがって、a() が実行されるとき、その実際のスコープは
add runtimescope |
---|
count runtimescope num = 0 |
count lexicalscope |
なので、add が呼び出されたとき1 回目は num が 0 なので 1 を返し、2 回目は 2 を返します。
5. 概要
上記の説明から、クロージャを生成するときに、外部関数のローカル変数 (実行時スコープ) が内部関数によって字句スコープとしてメモリに保存されることがわかります。 function このメモリ ブロックは、関数が解放されるまで解放されません。したがって、クロージャを使用するときは、メモリ リークに細心の注意を払う必要があります。