goo blog サービス終了のお知らせ 

ひ鳥ごと

Tweetとは、鳥のさえずりのことです。

JavaScriptでブロックスコープ

2007-06-07 03:33:48 | JavaScript
C言語由来の言語をやってると引っかかるのですが、JavaScriptには関数よりさらに狭いブロック独自のスコープが存在しません(withとcatchを除く)。

ところがIT戦記の「社内勉強会資料」に見たこともないようなwith文が出てきて戸惑いました。

for (var i = 0, l = nl.length; i <l; i ++) { with({e:e})
setTimeout(function() {
var box = new Box(e);
box.start();
}, i * 500);
}
JavaScript 入門より抜粋)

このwith({e:e})がミソですが(これがなければsetTimeoutの引数の関数中に出現するeは
最後に代入された値、すなわちnl[nl.length - 1]になる)、
ぱっと見理解できないわけですよ。でもよくよく考えたら、

for (var i = 0, l = nl.length; i <l; i ++) { with({label:e})
setTimeout(function() {
var box = new Box(label);
box.start();
}, i * 500);
}

と等価なんですね、このコード。それに気づいたときに目からうろこが落ちました、マジで。


と思ったらnantoさんのところで紹介されてたんですね。気づかなかったorz