クロージャ

クロージャとは、「ローカル変数を参照している関数内関数」。
function closure(init) {
    var counter = init;

    return function() {
        return ++counter;
    }
}

var myClosure0 = closure(0);
var myClosure100 = closure(100);

console.log(myClosure0()); // 1
console.log(myClosure100()); // 101
console.log(myClosure0()); // 2
console.log(myClosure100()); // 102
var myClosure1 = closure(0) で、変数 myClosure0 に、function(){return ++counter} という匿名関数が登録される。その後は、myClosure0() を呼び出す度に、myClosure0 が内部で保持しているローカル変数 counter の値がインクリメントされて返される。

別の変数に格納されたクロージャは、別のスコープチェーンに属すので、myClosure0 と myClosure100 は、同じ名前のローカル変数 counter を内部に保持しているが、counter に入っている値は異なる。

※本文中のサンプルコードは、『JavaScript本格入門』p.165を参考にしている。