まず、この結果が1,2,3と表示されるのは理解できると思います。
javascript
1var x = 1;
2for(var i = 0; i < 3; ++i){
3 alert(x);
4 x = x + 1;
5}
次に、ループの中身を関数にします。
カウントアップの部分が戻り値になります。
通常の関数はxの値を保持することができませんので、毎回引数にいれて更新する必要があります。
javascript
1var f = function(x){
2 alert(x);
3 return x + 1;
4};
5
6var x = 1;
7for(var i = 0; i < 3; ++i){
8 x = f(x);
9}
さらに、クロージャを使って関数の外部の変数を関数内から利用し、更新します。
変数は関数の外部にありますので、関数呼び出しによって初期値にもどることはありません。(と理解してください。)
javascript
1var x = 1;
2var f = function(){
3 alert(x);
4 x = x + 1;
5};
6
7for(var i = 0; i < 3; ++i){
8 f();
9}
最後に、変数xを隠すためにfunctionで括ります。
質問のコードとほぼ同じになります。
javascript
1function outer(){
2 var x = 1;
3 var inner = function(){
4 alert(x);
5 x = x + 1;
6 };
7 return inner;
8};
9var f = outer();
10
11for(var i = 0; i < 3; ++i){
12 f();
13}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。