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 関数を使用してのみ変更できます。
クロージャーは、親関数が閉じた後でも、親スコープにアクセスできる関数です。
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。