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