JavaScriptの関数、スレッド、および非同期実行
JavaScriptが内部でどのように動作しているかを理解する必要があります。
関数、プロセス、スレッド、および実行スタイルの内訳は以下の通りです。
JavaScript関数の種類
- 名前付き関数 (Named Function): 特定の名前を使用します。これによりデバッグが容易になります。
- 無名関数 (Anonymous Function): 名前がありません。コールバックとしてよく使用されます。
- 関数式 (Function Expression): 関数を変数に代入します。
- アロー関数 (Arrow Function):
=>シンボルを使用した短い構文です。 - IIFE: 即時実行関数式 (Immediately Invoked Function Expression)。定義するとすぐに実行されます。
プロセス vs スレッド
プロセスとは、コンピュータ上で実行されているプログラムのことです。
- 各プロセスは独自のメモリを持っています。
- 1つのプロセスがクラッシュしても、他のプロセスは実行を継続します。
- 例: ChromeとSpotifyは別のプロセスです。
スレッドとは、プロセス内にある小さな単位のことです。
- スレッドは同じメモリを共有します。
- これにより、単一のプログラムが一度に多くのことを行うことができます。
- 例: Chromeの内部では、1つのスレッドがページをレンダリングし、別のスレッドがマウスのクリックを処理します。
同期 vs 非同期
JavaScriptはシングルスレッドです。コールスタックを使用して、一度に1つのタスクを処理します。
同期実行 (Synchronous Execution):
- タスクは一つずつ順番に実行されます。
- 各タスクは、前のタスクが終了するのを待ちます。
- 遅いタスクは、コードの実行をブロックします。
非同期実行 (Asynchronous Execution):
- タスクはバックグラウンドで実行されます。
- タスクの終了を待っている間、コードは停止しません。
- これには、Web API、コールバックキュー、およびイベントループが使用されます。
非同期の仕組み:
- JavaScriptがタスク(タイマーなど)をWeb APIに送ります。
- メインのコードは実行を継続します。
- タスクが完了すると、コールバックキューに移動します。
- スタックが空になると、イベントループがそれをコールスタックに移動させます。
これにより、ウェブアプリの高速性とレスポンス性能が維持されます。