2007年02月17日

Javascript:setTimeout による呼び出しは関数終了時ではない?

予定された時間になり、その時実行中の関数が終了すれば setTimeout/setInterval での呼び出しが実行されるという訳じゃないんですよね。

ネットでたまに見かけるのは、「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>

おそらくブラウザ内の動作(スレッド)を考えると、上の表記では正確じゃないかも知れませんが、感覚的にはこの様になります。当然、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
posted by HiFa at 09:35 | 🌁 | Comment(0) | TrackBack(0) | JavaScript雑感 | このブログの読者になる | 更新情報をチェックする
>>> スパムコメントは消してますよん。 お互い無駄な労力は避けましょう。 <<<

この記事へのコメント

コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。