イベントループとは

いべんとるーぷ

JavaScriptの実行環境が、1本のスレッドで、順番を待っている処理を1つずつ取り出して実行する仕組み。クリックやタイマー、通信の完了などで発生した処理はタスクとして列に並び、いまのコードが終わるとイベントループが次のタスクを取り出す。Promiseの処理(マイクロタスク)は、1つのタスクが終わるたびに、次のタスクより先にすべて実行される。1つの処理が長く続くと、ほかのイベントの処理や画面の描画が止まる。

「イベントループ」は、1分野の1問の練習問題に出てきます(Web技術の基礎など)。

この用語の分野: Web技術の基礎

実行の順序

例えば console.log('A') の後に、setTimeout で B の表示を、Promise の then で C の表示を予約し、最後に console.log('D') を実行すると、表示は A、D、C、B の順になります。同期的なコードが最初にすべて実行され、その後でマイクロタスクのCが、最後にタスクのBが実行されます。setTimeout に0 msを指定しても、すぐには実行されません。

画面が固まる理由

ブラウザのメインスレッドは、JavaScriptの実行と、クリックなどのイベントの処理、画面の描画を受け持っています。数秒かかる計算を1回で実行すると、その間はイベントループが次のタスクを取り出せないので、ボタンが反応せず、画面も更新されません。重い計算は Web Worker で別のスレッドに移すか、小さく分けて少しずつ実行します。

非同期の入出力

通信やファイルの読み書きでは、完了を待つ間スレッドを止めず、終わったときに呼ぶ処理(コールバックやPromise)を登録しておきます。完了するとその処理がタスクとして列に入り、イベントループが順に実行します。Node.jsのようなサーバ側の実行環境も同じ考え方で、JavaScriptを1本のスレッドで実行しながら、多くの接続を扱います。

よくある質問

setTimeoutに0 msを指定すると、すぐに実行されますか?

いいえ。指定した時間が過ぎた後にタスクとして列に入り、いま実行中のコードと、それまでに並んだマイクロタスクが終わってから実行されます。0 msは「できるだけ早く、ただし今の処理の後で」という意味になります。

JavaScriptで並列に計算することはできますか?

ページのJavaScriptそのものは1本のメインスレッドで動きますが、Web Workerを使うと、別のスレッドでスクリプトを並列に動かせます。WorkerはDOMに直接触れられないので、メインスレッドとはメッセージをやり取りして結果を受け渡します。

解説の中の「イベントループ」

「イベントループ」が出てくる問題(1問)

  1. 上のJavaScriptをブラウザで実行したとき、コンソールに表示される文字の順序として正しいものはどれか。

Web技術の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

WebSocket HTTP HTTPステータスコード HTTPメソッド OAuth Cookie CORS(オリジン間リソース共有) サーバサイドレンダリング(SSR) JSON JWT(JSON Web Token)

用語集の一覧へ