JavaScript変数は、 ローカルまたはグローバルスコープに属することができます。
プライベート変数は、 クロージャで可能となります。
グローバル変数
関数は、このような関数の内部で定義されているすべての変数にアクセスすることができます。
しかし、この関数はまた、このように、関数外で定義された変数にアクセスすることができます。
最後の例では、 グローバル変数です。
Webページでは、グローバル変数はwindowオブジェクトに属します。
グローバル変数は、ページ内のすべてのスクリプトで使用(および変更)することができます(とウィンドウ)。
最初の例では、 ローカル変数です。
ローカル変数は、それが定義されている関数の内部で使用することができます。 これは、他の機能やその他のスクリプトコードから隠されています。
同じ名前のグローバル変数とローカル変数は異なる変数です。 1を変更すると、他は変更されません。
varキーワードなしで作成された変数は、それらが関数の内部で作成されていても、常にグローバルです。
変数の寿命
グローバル変数は、アプリケーション限り、生きて(/ウェブページあなたのウィンドウが)住んでいます。
ローカル変数は、短い命を持っています。 これらは、関数が呼び出されたときに作成され、関数が終了すると削除されます。
カウンターのジレンマ
あなたが何かをカウントするための変数を使用すると仮定し、あなたは、このカウンタは、すべての機能が利用できるようにしたいです。
あなたはカウンターを増加させるために、グローバル変数、および関数を使用することができます。
例
var counter = 0;
function add() {
counter += 1;
}
add();
add();
add();
// the counter is now equal to 3
»それを自分で試してみてください カウンターのみによって変更されるべきであるadd()関数。
問題は、ページ上の任意のスクリプトが呼び出さずに、カウンタを変更することができること、であるadd() 。
私は関数の内部カウンタを宣言した場合、誰も()を追加呼び出すことなく、それを変更することができなくなります。
例
function add() {
var counter = 0;
counter += 1;
}
add();
add();
add();
// the counter should now be 3, but it does not work !
»それを自分で試してみてください それは効かなかった! I呼び出すたびにadd()関数は、カウンタは1に設定されています。
JavaScriptの内側の関数はこれを解決することができます。
JavaScriptの入れ子関数
すべての関数はグローバルスコープへのアクセス権を持っています。
実際には、JavaScriptで、すべての機能がそれらを「上」スコープへのアクセス権を持っています。
JavaScriptは、ネストされた関数をサポートしています。 ネストされた関数は、それらの「上」スコープへのアクセス権を持っています。
この例では、内側の関数plus()親関数内でカウンタ変数にアクセスする場合があります:
例
function add() {
var counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
»それを自分で試してみてください 我々は達することができる場合、これは、カウンタのジレンマを解決している可能性がplus()外から関数を。
我々はまた、一度だけカウンタ= 0を実行するための方法を見つける必要があります。
私たちは、閉鎖を必要とします。
JavaScriptのクロージャ
自己起動機能を覚えていますか? この関数は何をするのでしょうか?
例
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
// the counter is now 3
»それを自分で試してみてください 例の説明しました
変数の追加は、自己呼び出す関数の戻り値が割り当てられます。
自己呼び出す関数は一度だけ実行されます。 これは、ゼロ(0)にカウンタを設定し、関数式を返します。
この方法では、関数となる追加します。 「素晴らしい」の部分は、それが親スコープにカウンタにアクセスできることです。
これは、JavaScriptのクロージャと呼ばれている。それは、それが可能な機能は、 " プライベート "変数を持つようになります。
カウンタは、匿名関数の範囲によって保護されており、唯一の追加機能を使用して変更することができます。
クロージャは、親関数が閉じられた後も、親スコープにアクセスする機能です。