
200ミリ秒でボタンを押す → 4000ミリ秒待機 → 残りの1800ミリ秒待機 → 6000が出力となるのではないかと思っていました。
なりません。これには2つの要因があります。
setTimeoutは、「何ミリ秒後に動かす」というリストに登録する処理を行う、というイメージです。積極的に待ち続けるという処理を行うものではありません。- JavaScriptはシングルスレッドなので、
while()で回し続けるようなビジーループをかけると、他のハンドラ類も一切動かなくなります。
ということで、タイムラインとしては以下のようになります。
0ミリ秒→setTimeoutでタイマーが登録される
200ミリ秒→ボタンを押してビジーループがスタート
2秒→setTimeoutのタイマーが時間を迎えるけど、ビジーループがまわり続けているので動作しない
4.2秒→ビジーループが終了したことで、ようやくsetTimeoutのハンドラが動作

0 コメント