P粉7344867182023-08-23 09:30:55
JavaScript では、各関数は外部の語彙環境へのリンクを維持します。字句環境は、スコープ内のすべての名前 (変数、パラメーターなど) とその値のマップです。
したがって、function
キーワードが表示されるたびに、その関数内のコードは関数の外部で宣言された変数にアクセスできます。
関数 bar
がパラメータ x
と変数 tmp
を閉じるため、これは
16 を出力します。これらは両方とも外部関数に存在します。
foo
関数
bar は、関数
foo
関数はクロージャを作成するために return
を行う必要はありません。宣言だけで、各関数はそれを囲む字句環境を囲み、クロージャを形成します。
#bar
のコードは、パラメータ x
と変数 tmp
が直接参照されなくなっても参照できるため、上記の関数は 16 も出力します。範囲。
ただし、tmp
は bar
のクロージャ内にまだ存在するため、インクリメントできます。 bar
が呼び出されるたびに増加します。
クロージャの最も単純な例は次のとおりです:
JavaScript 関数が呼び出されると、新しい実行コンテキスト ec
が作成されます。関数パラメータとターゲット オブジェクトに加えて、この実行コンテキストは、呼び出し元の実行コンテキストの字句環境へのリンクも受け取ります。これは、外部字句環境で宣言された変数を意味します (上記の例では、a#)。 ## および
b) には
ec からアクセスできます。
クロージャに表示されるのは変数そのものであり、コピーではないことに注意してください。
P粉9044059412023-08-23 00:50:56
クロージャは次のペアです:
字句環境はすべての実行コンテキスト (スタック フレーム) の一部であり、識別子 (つまり、ローカル変数名) と値の間のマッピングです。
JavaScript のすべての関数は、外部の字句環境への参照を維持します。この参照は、関数の呼び出し時に作成される実行コンテキストを構成するために使用されます。この参照により、関数がいつどこで呼び出されるかに関係なく、関数内部のコードが関数の外部で宣言された変数を「参照」できるようになります。
関数が別の関数によって呼び出される場合、外部の字句環境への一連の参照が作成されます。このチェーンはスコープ チェーンと呼ばれます。
次のコードでは、inner
は、foo
が呼び出されたときに作成される実行コンテキストの字句環境を使用してクロージャを形成し、クロージャには変数 secret## が含まれています。 #: