Javascriptのブロックスコープ

もうひとつ思い出したのでメモ

とりあえず例

(function(){
  for(var i = 0; i < 3; i++){
    setTimeout(function(){
      console.log(i);
    }, (i * 1000));
  }
})();

とやると 3 が3回出てきてしまいます。本来なら i を3回出したい、つまりは 0, 1, 2 と出したいものの、スコープチェーンから言って当たり前ですが、 3 が3回出てしまいます。こんなときはwithを使う

(function(){
  for(var i = 0; i < 3; i++){
    with({i:i}){
      setTimeout(function(){
        console.log(i);
      }, (i * 1000));
    }
  }
})();

そんだけ。もうこのネタも古くなった…