クロージャとは、「ローカル変数を参照している関数内関数」。
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を参考にしている。