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