JSわかりません

var fx1 = function(){
  var x = 0;
  return function(){
    x = x + 1;
    return x;
  }
};
var fx2 = fx1();
var fx3 = fx1();


alert(fx2() + ":" + fx2() + ":" + fx2());//#=>1:2:3
alert(fx3() + ":" + fx3() + ":" + fx3());//#=>1:2:3

がわかりません
ソースを汚してみた

var x = 10;//(*)グローバルに同じのをおいてみた
//function内部でxを定義しない限りここまで探しにくる11:12:13/14:15:16を出力
var fx1 = function(){
  var x = 0;//(*)この定義だとグローバルはいじらない->最後のalertが10を出力した。
 //x = 0;//この定義だとグローバルをいじる。処理後にalert(x)を最後に行うと6を出力する
  alert(x);//ここはfx2とfx3を設定したときに一回ずつ通る。環境!がセットアップされるということ?

  return function(){
    x = x + 1;//ここのxが何者なのかが問題。
    return x;
  }
};

var fx2 = fx1();
//この行でvar x = 0;直下のalert(x)が実行される。
//=>環境のxに0が入ったってこと?
//var fx3 = fx1();


alert(fx1());//1回呼び出されるaleart //=>function(){x=x+1;return x}を出力。関数を出力した。関数の中のxが問題

alert(fx2() + ":" + fx2() + ":" + fx2());//既にxには0がバインドされている環境でのfunction呼び出しをするということ?
//この呼び出しの環境にはxが作成されて値が入った状態になっている。これがクロージャ?ってことにしよう。「functionがクロージャです」、ってこと?
alert(fx3() + ":" + fx3() + ":" + fx3());//これで別環境が(クロージャ?)発生していることを確認。


alert(x);//グローバルへの影響の有無を確認


//(*)の部分の二つのxは別物。さらにはfx2とfx3のxも別物。っていうのがクロージャの効果

ソース汚しているうちに
何となくクロージャがわかった気になった。

ねる。
MSNメッセで会社の人たちが会社にいることがわかってなんだかテンションが下がった。もっと自分を巻き込んでいかないと!
今日とてもいい話を聞いた。
「会社には開発環境がある。休みの日は会社は静かだし、好きなことするには最高の環境なんだぜ?」
参考にしようwww