English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
JavaScriptの変数は属するできますローカルスコープまたはグローバルスコープ
使用できますクロージャグローバル変数をローカル(プライベート)に設定します。
ある物をカウントする変数を使用し、すべての関数でカウンタが使用できるようにしたいとします。
グローバル変数とカウンタを増加させる関数を使用できます:
// カウンタを初期化する var counter = 0; // カウンタを増加させる関数 function increment() { counter++; } // increment()を呼び出します 3回 increment(); increment(); increment(); // 現在はこのカウンタが3 document.getElementById("output").innerHTML = `カウンタ: ${counter}`;テストを見て‹/›
上面的解决方案存在一个问题:页面上的任何代码都可以更改计数器,而无需调用increment()。
JavaScriptの内部関数はこの問題を解決できます。
JavaScriptはネスト関数をサポートしています。ネスト関数は上層のスコープにアクセスできます。
この例では、内部関数は外部関数内のカウンタ変数にアクセスできます:
function outer() { var counter = 0; function inner() { counter++; } return counter; }テストを見て‹/›
ネスト関数は前の問題を解決できます、inner()関数を外部からアクセスできる場合です。
さらにcounter = 0を一度だけ実行する方法を見つける必要があります、それが以下で説明される閉包です。
閉包は関数とその関数を宣言する文法的環境の組み合わせです。
閉包は別の関数のスコープから変数にアクセスできます。これは関数内部で関数を作成することで実現されます。もちろん、外部関数は内部スコープにアクセスできません。
var increment = (function() { var counter = 0; function inner() { return ++counter; } return inner; })();テストを見て‹/›
変数の増分に自関数の返値が割り当てられます。
自関数は一度だけ実行されます。カウンタを0に設定し、関数式を返します。
閉包は親関数が閉じられていても、親スコープにアクセスできる関数です。