gotin blog

Whatever gotin wanna write

javascriptのクロージャのおさらいメモ

var funcs = [[],[],[],[]];
for(var i=0;i<3;i++){
  // グローバルのiを参照
  funcs[0].push(function(){return i;});

  // function内のxを参照
  funcs[1].push((function(){ 
    var x = i;
    return function(){return x;};
  })());

  // function内のiを参照(引数で渡す)
  funcs[2].push((function(i){
    return function(){return i;};
  })(i));

  // with()内のオブジェクトのプロパティiの値を参照
  with({i:i}){
    funcs[3].push(function(){return i;});
  }
}

//結果出力:Firebugで。
for(var i=0;i<4;i++){
  console.log(i+":"+funcs[i][1]()); 
}

結果:

0:0
1:1
2:1
3:1

0番目は失敗例として、
1,2,3の方法でiの値を閉じ込めることができる。
変数のスコープはfunction内で、with内も似たようなことになる、と覚えておけばいいわけすね。

0番目の場合は一番外側の領域内でiの値を探しにいくので、その実行時のiの値0が使われた、と処理されたとみればいいんすね。