ネットでたまに見かけるのは、「function fn(){setTimeout(cb, 20); ・・・;} の場合、・・・の処理が終わって fn(); が終了していないと、20msec 経過しても cb は呼び出されない」などの内容で完結していることがありますが、実際は fn(); が終了していても呼び出されないことがあります。
ま。とある記事読んでいて、あれれ?と思ったので・・・。というか、自分自身も意識しないとそう言ってる。
function fn(){setTimeout(cb, 20); ・・・;}
function cb(){・・・;}
function ex(){・・・;} // その他別処理を行う関数など
となっていてそれぞれの処理に 20msec 以上掛かる場合。(掛からなくても同じだけど・・・。ま、一応)
<script type="text/javascript">
fn();
<-- ここでは cb は呼び出されない
ex();
<-- ここでも cb は呼び出されない???※1
</script>
<script type="text/javascript">
ex();
<-- ここでようやく cb が呼び出される※2
</script>
fn();
<-- ここでは cb は呼び出されない
ex();
<-- ここでも cb は呼び出されない???※1
</script>
<script type="text/javascript">
ex();
<-- ここでようやく cb が呼び出される※2
</script>
おそらくブラウザ内の動作(スレッド)を考えると、上の表記では正確じゃないかも知れませんが、感覚的にはこの様になります。当然、cb の呼び出しが複数予定されていても同じ。※1に呼び出されるブラウザもありますが、基本 ※2 以降にそれらの呼び出しが行われると考えていた方が無難です。
結局、一旦待機状態にならないとタイマによる呼び出しは行われないと言うことかな。
■ ブラウザによる動作の相違
※1 で呼び出されるブラウザ(確認したもの)
ie 5.0, 5.5, 6.0
op 8.53, 9.01
※2 で呼び出されるブラウザ(確認したもの)
ie 7.0
ff 1.5, 2.0
ns 7.1
「※1 で呼び出される」と書いてますが、たまに ※2 になったりします。
ま、それぞれ数回の試行しかしてませんが、ie 7.0 を除き、なんとなく納得できますw



この記事へのコメント