私の歴史と今

振り返ると恥ずかしくなるのが私の歴史。だけどそのときは真面目に書いていた訳でね。そんな今の私を書いていく。

クロージャとは、

「関数本体+スコープ」ってことね。理解したぜ! いや嘘。スコープ? スコープチェーンといった方がいいのかな。

function f(x){
 return function c(y){
   alert(x + y);
 };
}
var c1 = f(1);
var c2 = f(2);
c1(2); // 3
c2(2); // 4 
alert(c1 === c2); // false

関数c内の変数xは、関数cのスコープでは解決できないが、スコープチェーンの次にある関数fのスコープで解決できる。しかし、そのスコープはすでに終了しているのだから、変数yを参照することはできないと思いきや、できる。それはなぜかというと、関数fの処理が終わっても、関数fのスコープが関数cのスコープチェーンに残っているから。
だから、変数c1が参照する関数のスコープチェーンにも、変数c2が参照する関数のスコープチェーンにも、関数fのスコープが生き残っており、しかも互いに別スコープになっている。変数c1が参照する関数のスコープチェーンの関数fのスコープの変数yは1。それに対して、変数c2の方は2。このような関数(例の関数c)をクロージャという。つまり、関数本体だけでなく、その関数以外の関数スコープを持つもの(利用しているもの、といってもいい?)。
あ、うそうそ。なんか勘違いしてるな。また明日書こう・・・。