JavaScriptガイド

言語内部、ランタイム、フレームワーク — コードレベルで動作原理整理

⚙️ 言語内部

🔄

イベントループ — setTimeout(fn, 0)が即座に実行されない理由

Call Stack、Task Queue、Microtask Queueの実行順序

JavaScriptはシングルスレッドなのに非同期が可能な理由:イベントループがCall Stackが空の時にTask Queueからコールバックを取り出して実行するから。Promiseのthenは Microtask Queueに入り通常Taskより先に実行される。

🔗

クロージャとスコープチェーン — 関数が外部変数を記憶する原理

Lexical Environmentオブジェクトが作るスコープチェーンの内部構造

クロージャは関数が生成された時点のLexical Environmentをキャプチャして保存するもの。関数が外部スコープの変数を参照すると、そのLexical Environmentオブジェクトがガベージコレクションされず生き残る。

🧬

プロトタイプチェーン — classがなかった時代の継承

__proto__、prototype、Object.create()の関係

JavaScriptのclassはシンタクティックシュガー。内部的にプロトタイプチェーンで動作する。オブジェクトの__proto__が親オブジェクトを指し、プロパティが見つからなければチェーンを辿り上がる。

⛓️

Promise内部 — then()がMicrotask Queueに入る過程

Promiseの3つの状態とthenableチェーンの実行メカニズム

Promiseはpending/fulfilled/rejectedの3状態を持つ状態マシン。resolve()呼び出し時にthenに登録されたコールバックがMicrotask Queueに入る。async/awaitはPromiseのシンタクティックシュガー。

🌐 ブラウザAPI

👷

Web Workers — JavaScriptでマルチスレッドを使う方法

postMessageの構造化複製(Structured Clone)とSharedArrayBuffer

Web Workerはメインスレッドと別のスレッドでJavaScriptを実行する。DOMアクセス不可、postMessageで通信。重い計算をWorkerに回せばUIが止まらない。

Service Workerライフサイクル — install、activate、fetchの順序

PWAの核心、オフラインキャッシュが動作するメカニズム

Service Workerはブラウザとネットワークの間にプロキシとして動作する。install→activate→fetchの順でライフサイクルが進行し、Cache APIでリソースを保存してオフラインでもアプリが動作するようにする。

👁️

Intersection Observer — スクロールイベントなしで要素の可視性を検出

lazy loading、無限スクロール、アニメーショントリガーの高性能実装方法

Intersection Observerは要素がビューポートに入る/出る時にコールバックを実行する。scrollイベント+getBoundingClientRect()より性能が良く、ブラウザが最適化されたタイミングで実行。

💬

Popover API — JavaScriptなしでツールチップが作れるようになった理由

popover属性1つで開閉・Escキー・アクセシビリティが自動動作するブラウザネイティブUI

従来のツールチップにはイベントリスナー、状態管理、ARIA属性の手動同期が全て必要だった。Popover APIはこれをブラウザネイティブで置き換える。popover属性とpopovertargetだけで開閉・Escキー・キーボードナビゲーションが自動動作。