JavaScript クロージャ
JavaScript 変数は、ローカルスコープまたは グローバルスコープに属することができます。
グローバル変数は、クロージャを使用してローカル (プライベート) にすることができます。
グローバル変数
次のように関数内でfunction定義されたすべての変数にアクセスできます。
ただし、次のように、関数の外部でfunction定義された変数にアクセスすることもできます。
最後の例では、aですグローバル変数。
Web ページでは、グローバル変数はページに属します。
グローバル変数は、ページ内の他のすべてのスクリプトで使用 (および変更) できます。
最初の例では、aです地元変数。
ローカル変数は、それが定義されている関数内でのみ使用できます。他の関数や他のスクリプト コードから隠されています。
同じ名前のグローバル変数とローカル変数は別の変数です。一方を変更しても、他方は変更されません。
作成された変数それなし宣言キーワード (var、let、 またconst) は、関数内で作成された場合でも、常にグローバルです。
可変寿命
グローバル変数は、別のページに移動するか、ウィンドウを閉じるときなど、ページが破棄されるまで有効です。
ローカル変数の寿命は短いです。関数が呼び出されると作成され、関数が終了すると削除されます。
カウンタージレンマ
何かをカウントするために変数を使用し、このカウンターをすべての関数で使用できるようにしたいとします。
グローバル変数とfunctionカウンターを増やすには
例
上記のソリューションには問題があります。ページ上のコードは、add() を呼び出さずにカウンターを変更できます。
カウンターは、add()関数、他のコードがそれを変更するのを防ぐために
例
ローカルカウンターではなくグローバルカウンターを表示しているため、機能しませんでした。
グローバル カウンターを削除し、関数にローカル カウンターを返させることでローカル カウンターにアクセスできます。
例
関数を呼び出すたびにローカルカウンターをリセットしたため、機能しませんでした。
JavaScript 内部関数はこれを解決できます。
JavaScript ネスト関数
すべての関数は、グローバル スコープにアクセスできます。
実際、JavaScript では、すべての関数が「上の」スコープにアクセスできます。
JavaScript はネストされた関数をサポートしています。ネストされた関数は、それらの「上の」スコープにアクセスできます。
この例では、内部関数plus()にアクセスできますcounter親関数の変数:
例
plus()この機能に外部からアクセスできれば、カウンターのジレンマは解決できたかもしれません。
また、一度だけ実行する方法を見つける必要もありますcounter = 0。
閉鎖が必要です。
JavaScript クロージャ
自己呼び出し関数を覚えていますか?この関数は何をしますか?
例
例の説明
変数add自己呼び出し関数の戻り値に割り当てられます。
自己呼び出し関数は 1 回だけ実行されます。カウンターをゼロ (0) に設定し、関数式を返します。
このように add は関数になります。 「素晴らしい」部分は、親スコープのカウンターにアクセスできることです。
これを JavaScript と呼びます閉鎖。関数が「プライベート"変数。
カウンターは無名関数のスコープによって保護されており、add 関数を使用してのみ変更できます。
クロージャーは、親関数が閉じた後でも、親スコープにアクセスできる関数です。