JavaScriptクロージャ
JavaScript変数は、ローカルスコープまたは グローバルスコープに属することができます。
グローバル変数は、クロージャーを使用してローカル(プライベート)にすることができます。
グローバル変数
Aは、次のように、関数内function
で定義されたすべての変数にアクセスできます。
例
function myFunction() {
let a = 4;
return a * a;
}
ただし、次のように、関数の外部function
で定義された変数にアクセスすることもできます。
例
let a = 4;
function myFunction() {
return a * a;
}
最後の例では、aはグローバル 変数です。
Webページでは、グローバル変数はウィンドウオブジェクトに属します。
グローバル変数は、ページ内(およびウィンドウ内)のすべてのスクリプトで使用(および変更)できます。
最初の例では、aはローカル 変数です。
ローカル変数は、それが定義されている関数内でのみ使用できます。他の関数や他のスクリプトコードからは隠されています。
同じ名前のグローバル変数とローカル変数は異なる変数です。一方を変更しても、もう一方は変更されません。
宣言キーワード(、、、または)なしで作成
された変数は、関数内で作成された場合でも、常にグローバルです。var
let
const
例
function myFunction() {
a = 4;
}
可変寿命
グローバル変数は、別のページに移動したりウィンドウを閉じたりするときのように、ページが破棄されるまで存続します。
ローカル変数の寿命は短いです。これらは、関数が呼び出されたときに作成され、関数が終了したときに削除されます。
カウンタージレンマ
何かを数えるために変数を使用し、このカウンターをすべての関数で使用できるようにしたいとします。
グローバル変数を使用してfunction
、カウンターを増やすことができます。
例
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
counter += 1;
}
// Call add() 3 times
add();
add();
add();
// The counter should now be 3
上記の解決策には問題があります。ページ上のどのコードでも、add()を呼び出さなくてもカウンターを変更できます。
add()
他のコードがカウンターを変更しないように、カウンターは関数に対してローカルである必要があります。
例
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 0
ローカルカウンターの代わりにグローバルカウンターを表示するため、機能しませんでした。
関数に返させることで、グローバルカウンターを削除し、ローカルカウンターにアクセスできます。
例
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
return counter;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 1.
関数を呼び出すたびにローカルカウンターをリセットするため、機能しませんでした。
JavaScriptの内部関数でこれを解決できます。
JavaScriptの入れ子関数
すべての関数はグローバルスコープにアクセスできます。
実際、JavaScriptでは、すべての関数がその「上」のスコープにアクセスできます。
JavaScriptはネストされた関数をサポートします。ネストされた関数は、それらの「上」のスコープにアクセスできます。
この例では、内部関数は親関数plus()
の変数にアクセスできます。counter
例
function add() {
let counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
plus()
外部から機能に到達できれば、これでカウンターのジレンマを解決できたはずです。
また、一度だけ実行する方法を見つける必要がありますcounter = 0
。
閉鎖が必要です。
JavaScriptクロージャ
自己呼び出し関数を覚えていますか?この関数は何をしますか?
例
const add = (function () {
let counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add();
// the counter is now 3
例の説明
変数add
は、自己呼び出し関数の戻り値に割り当てられます。
自己呼び出し機能は1回だけ実行されます。カウンターをゼロ(0)に設定し、関数式を返します。
このようにして、addは関数になります。「素晴らしい」部分は、親スコープのカウンターにアクセスできることです。
これはJavaScriptクロージャと呼ばれます。関数が「プライベート」変数を持つことを可能にします。
カウンターは無名関数のスコープによって保護されており、add関数を使用してのみ変更できます。
クロージャは、親関数が閉じられた後でも、親スコープにアクセスできる関数です。