「関数本体+スコープ」ってことね。理解したぜ! いや嘘。スコープ? スコープチェーンといった方がいいのかな。
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)をクロージャという。つまり、関数本体だけでなく、その関数以外の関数スコープを持つもの(利用しているもの、といってもいい?)。
あ、うそうそ。なんか勘違いしてるな。また明日書こう・・・。