
実行の仕組み
コールスタックは「積む・戻る・巻き戻る」だけ:Node.js で動きと上限を確かめる
関数呼び出しがどう積まれ、return と例外でどう消えるのか。スタックの上限は何で決まるのか。Node.js で動かして確かめます。
ページ一覧
- コールスタックとは何かコールスタックは、ECMAScript の仕様では「実行コンテキストスタック」と呼ばれます。関数を呼ぶたびに積まれ、動くのは一番上の 1 つだけです。Node.js で呼び出し履歴を出して確かめます。
- return で 1 つずつ戻る関数が終わるとスタックの一番上が外れ、呼び出し元の続きに戻ります。戻る順は積んだ順の逆です。同期のコードが上から順に動いて見えるのは、この待ち合わせがあるからです。
- 例外は巻き戻すthrow されると、呼び出しの後ろの行は飛ばされ、finally だけを内側から実行しながら catch まで巻き戻ります。catch の中では投げた側の関数がもうスタックにいないことも、Node.js で実測します。
- 上限を超えると RangeError。上限は搭載メモリでは決まらないMaximum call stack size exceeded が出る深さは、搭載メモリではなく V8 の --stack-size と OS のスタック上限で決まります。引数の数や Node のバージョンで深さが変わる様子も実測します。
- 非同期のコールバックは、空になった短いスタックから始まるsetTimeout と Promise.then のコールバックは、登録した関数の上では動かず、呼び出し元のいない短いスタックから始まります。Node.js でスタックを出して確かめます。
- まとめ動くのは一番上の 1 つだけ、return は 1 つ戻り例外は catch まで巻き戻す、上限は --stack-size と OS で決まる、非同期は短いスタックから始まる。コールスタックの要点を 4 つにまとめます。