クロージャーを定義する
説明
JavaScriptではfunction(){}を使ってクロージャー(関数とそれを評価する環境)として記述することができます。クロージャーを使うには処理したい関数内で、実行したいブロック内容を関数の戻り値として返します。この関数からの戻り値をローカル変数にすると、その変数内容は保持されたままります。サンプルのようにvar obj1 = increment();とするとobj1に関数と環境が設定されます。ここでobj1()とすると関数incrementで定義した関数の処理が実行されます。単純にincrement()()とした場合でも同様に処理が実行されますが、この場合は環境が引き継がれないため変数nの内容が引き継がれず初期値のままになります。これに対してobj1();obj1();のように連続して呼び出した場合、obj1に環境が引き継がれているため変数nの内容が加算され保持されることになります。また、この変数nはobj1.nのようにオブジェクトのプロパティとして参照することはできません(プロパティにはなりません)。
サンプルプログラム
function increment(){
var n = 0;
return function() {
n = n + 1;
return n * n;
}
}
var obj1 = increment();
var obj2 = increment();
obj2();
obj2(); // 2回先に実行してみます。
for (var i=0; i<10; i++){
document.write("obj1,2 = "+obj1()+", "+obj2()+"<br>");
}