JavaScript イベントループ

setTimeout を使う時はイベントループについて意識しておくと良いです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/EventLoop

特に上記URLの以下の部分です。

setTimeoutを呼び出すと、2番目の引数として渡された時間が経過した後、メッセージがキューに追加されます。キューに他のメッセージがない場合、メッセージはすぐに処理されます。しかしながら、メッセージがある場合、setTimeoutメッセージは他のメッセージを処理するために待機する必要があります。そのため第二引数は、保証時間ではなく、最小の時間を示しています。

setTimeout はキューの状態によって、いつ実行されるかが左右されます。

setTimeout の第二引数の時間後に実行されるのではなく、時間以降に実行されるので注意が必要です。