このコードはどのように実行されているか説明位していく
まず、グローバルコンテキストが実行されることで、clickイベント(task2)が実行される
その後にグローバルコンテキスト内で関数aが実行されて、関数a内のsetTimeout(task2)が実行されたことにより4s待機することになる。
4s秒待機している間にクリックイベントを発火すると、タスクキューにtask2が入り、4s後にtask2がタスクキューに入る
そして、コールスタックは5秒経った後に関数aの実行を終了し、関数aの実行が終了するとグローバルコンテキストも実行が終了する(first in first out)
次にイベントループがタスクキューにコールスタックが空いていることを知らせて、タスクキューに格納された最初のtask2がコールスタックに移動する
そしてtask2の実行が完了したらtask1がコールスタックに移動する
(メインスレッドが占有されている状態とはコールスタックが空になっていない状態を指す。)
補足 コールスタックにコンテキストが積まれている状態では、タスクキューに入っているタスクは待ちの状態になっているので、コンテキストが処理されるまではタスクキューののtaskがコールスタックに移動することはない
このような処理でタスクが実行されていき、タスクキューに入った順番で非同期が処理される