84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
JavaScript クロージャの概念 (関数、変数など) は理解しているが、クロージャ自体は理解していない人にクロージャを説明するにはどうすればよいでしょうか?
ウィキペディアにあるスキームの例を見ましたが、残念ながら役に立ちませんでした。
JavaScript では、各関数は外部の語彙環境へのリンクを維持します。字句環境は、スコープ内のすべての名前 (変数、パラメーターなど) とその値のマップです。
したがって、functionキーワードが表示されるたびに、その関数内のコードは関数の外部で宣言された変数にアクセスできます。
function
関数barがパラメータxと変数tmpを閉じるため、これは16を出力します。これらは両方とも外部関数に存在します。foo
bar
x
tmp
これは
を出力します。これらは両方とも外部関数に存在します。
関数barは、関数foo
関数
は、関数
関数はクロージャを作成するためにreturn
#barのコードは、パラメータxと変数tmpが直接参照されなくなっても参照できるため、上記の関数は 16 も出力します。範囲。
#bar
ただし、tmpはbarのクロージャ内にまだ存在するため、インクリメントできます。barが呼び出されるたびに増加します。
クロージャの最も単純な例は次のとおりです:
JavaScript 関数が呼び出されると、新しい実行コンテキストecが作成されます。関数パラメータとターゲット オブジェクトに加えて、この実行コンテキストは、呼び出し元の実行コンテキストの字句環境へのリンクも受け取ります。これは、外部字句環境で宣言された変数を意味します (上記の例では、a#)。 ## およびb) にはecからアクセスできます。
ec
a#)。 ## および
) には
からアクセスできます。
クロージャは次のペアです:
字句環境はすべての実行コンテキスト (スタック フレーム) の一部であり、識別子 (つまり、ローカル変数名) と値の間のマッピングです。
JavaScript のすべての関数は、外部の字句環境への参照を維持します。この参照は、関数の呼び出し時に作成される実行コンテキストを構成するために使用されます。この参照により、関数がいつどこで呼び出されるかに関係なく、関数内部のコードが関数の外部で宣言された変数を「参照」できるようになります。
関数が別の関数によって呼び出される場合、外部の字句環境への一連の参照が作成されます。このチェーンはスコープ チェーンと呼ばれます。
次のコードでは、innerは、fooが呼び出されたときに作成される実行コンテキストの字句環境を使用してクロージャを形成し、クロージャには変数secret## が含まれています。 #:
inner
foo
secret## が含まれています。 #:
JavaScript では、各関数は外部の語彙環境へのリンクを維持します。字句環境は、スコープ内のすべての名前 (変数、パラメーターなど) とその値のマップです。
したがって、
function
キーワードが表示されるたびに、その関数内のコードは関数の外部で宣言された変数にアクセスできます。関数
の字句環境内。bar
がパラメータx
と変数tmp
を閉じるため、これは
16を出力します。これらは両方とも外部関数に存在します。
foo
の字句環境へのリンクとともに、クロージャを形成します。関数
barは、関数
foo関数はクロージャを作成するためにreturn
を行う必要はありません。宣言だけで、各関数はそれを囲む字句環境を囲み、クロージャを形成します。#bar
のコードは、パラメータx
と変数tmp
が直接参照されなくなっても参照できるため、上記の関数は 16 も出力します。範囲。ただし、
tmp
はbar
のクロージャ内にまだ存在するため、インクリメントできます。bar
が呼び出されるたびに増加します。クロージャの最も単純な例は次のとおりです:
JavaScript 関数が呼び出されると、新しい実行コンテキスト
すべての関数には外部の字句環境へのリンクがあるため、すべての関数はクロージャを作成します。 クロージャに表示されるのは変数そのものであり、コピーではないことに注意してください。ec
が作成されます。関数パラメータとターゲット オブジェクトに加えて、この実行コンテキストは、呼び出し元の実行コンテキストの字句環境へのリンクも受け取ります。これは、外部字句環境で宣言された変数を意味します (上記の例では、a#)。 ## および
b) には
ecからアクセスできます。
クロージャは次のペアです:
字句環境はすべての実行コンテキスト (スタック フレーム) の一部であり、識別子 (つまり、ローカル変数名) と値の間のマッピングです。
JavaScript のすべての関数は、外部の字句環境への参照を維持します。この参照は、関数の呼び出し時に作成される実行コンテキストを構成するために使用されます。この参照により、関数がいつどこで呼び出されるかに関係なく、関数内部のコードが関数の外部で宣言された変数を「参照」できるようになります。
関数が別の関数によって呼び出される場合、外部の字句環境への一連の参照が作成されます。このチェーンはスコープ チェーンと呼ばれます。
次のコードでは、
inner
は、foo
が呼び出されたときに作成される実行コンテキストの字句環境を使用してクロージャを形成し、クロージャには変数secret## が含まれています。 #: