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
ところが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