setTimeoutとかsetIntervalって内部的にevalしてんのかよ
久しぶりにjavascriptをいじった。プログラミング自体大してできないのに半年も触らないともの凄い勢いで文法とか忘れててsetTimeoutの使い方についてはなんかもういつも忘れてて毎回はまってる気がするので、覚書。
setTimeoutでtestEventという関数を100ms後に実行したい場合は以下のように使っちゃいたくなる。
setTimeout("testEvent",100);
もうこの時点で普通に考えれば分かるんだけど、testEventを文字列として渡しているということは、これはevalと同じ方法でこのtestEventが評価されるということになる。ということは指定の100msよりもスーパー遅いタイミングでこの関数が実行される。setIntervalやFunctionコンストラクタも同様。
setTimeoutやsetIntervalについて、その第一引数には文字列だけでなく、関数を渡すことが出来るので、次のように使うとよい。
setTimeout(function(){ testEvent(); },100);
あと、setTimeoutなりsetIntervalの第一引数の関数に引数渡したい場合、こういう書き方が勧められている場合もある。
setTimeout("testEvent('" + e + "')",100);
この書き方は本当に死んだほうがよくて、僕はこのeという引数としてオブジェクトを渡したかったんだけど、いざ結果を見てみたら、そのオブジェクト自身は渡されずにオブジェクトをtoStringしたものだけが渡されていて、怒りのあまり黄金の右ストレートをパソコンにぶちこんでしまったわけであります。
なので、引数渡したいときは以下のようにすべし。
setTimeout(function(){ testEvent(e); },100);
参考:
http://dev.opera.com/articles/view/efficient-javascript-ja/?page=2