[javascript] Q. クロージャとは

A.
function closure() {
  var  count = 0;
  return function() {
    return ++count;
  }
}
var counter = closure();
console.log( counter() ); // 1
console.log( counter() ); // 2
console.log( counter() ); // 3

このプログラムの動作を確認してみましょう。
1. closure関数を実行して、グローバル変数counterに返却された無名関数を代入します。
2. counterには無名関数が入っているので実行するとcountの値がインクリメントされます。

プログラムの内部ではどのように動作しているのでしょうか?
1.でclosure関数を実行した際にActivationオブジェクトが生成されます。
返却された無名関数の中でActivationオブジェクトに関連づけられている変数countが
利用されているのでActivationオブジェクトが生き続けます。
故にスコープチェーンが生き続け変数countの値が保持されつづけます。

closure関数を実行して別の変数にも返却された無名関数を代入して動作を確認してみましょう。
function closure() {
  var  count = 0;
  return function() {
    return ++count;
  }
}
var counter = closure();
console.log( counter() ); // 1
console.log( counter() ); // 2

var counter2 = closure();
console.log( counter2() ); // 1
console.log( counter() ); // 3

countの値はそれぞれ独立して増えている事が確認できます。
これは関数を実行した時に新たにActivationオブジェクトが生成され
そのオブジェクトのプロパティとして新規にcount変数が作られ
新しくスコープチャーンも作られる為にcountの値はそれぞれ別の値になります。