Call stack (コールスタック)

コールスタック (call stack) は、インタープリター (ウェブブラウザー内の JavaScript インタープリターなど) の仕組みの一つで、複数階層の関数を呼び出したスクリプト内の位置を追跡し続けることです。 — どの関数が現在実行されているのか、その関数の中でどの関数が呼び出されたか、などです。

  • スクリプトが関数を呼び出すとき、インタープリターはそれをコールスタックに追加し、それから関数の実行を始めます。
  • その関数から呼び出されたどの関数も、コールスタックのその上に追加され、呼び出し先を実行します。
  • 現在の関数が終了すると、インタープリターはスタックからそれを外し、最後のコードがリストされている場所から実行を再開します。
  • スタックが割り当てられている量よりも多くのスペースを使用した場合、 "stack overflow" エラーとなります。

js
function greeting() {
  // [1] Some code here
  sayHi();
  // [2] Some code here
}
function sayHi() {
  return "Hi!";
}

// Invoke the `greeting` function
greeting();

// [3] Some code here

上記のコードは次のように実行されます。

  1. greeting() 関数の呼び出しまで、すべての関数を無視する。
  2. greeting() 関数をコールスタックリストに追加する。

    メモ: コールスタックリスト: - greeting

  3. greeting() 関数の中にあるコードのすべての行を実行する。
  4. sayHi() 関数の呼び出しまで移動する。
  5. コールスタックリストに sayHi() 関数を追加する。

    メモ: コールスタックリスト: - greeting - sayHi

  6. sayHi() 関数の中にあるコードのすべての行を、末尾に達するまで実行する。
  7. 実行を sayHi() を呼び出した行に戻し、 greeting() 関数の残りの実行を続ける。
  8. sayHi() 関数をコールスタックリストから削除する。

    メモ: コールスタックリスト: - greeting

  9. greeting() 関数の中のすべてを実行したら、これを呼び出した行に戻り、残りの JavaScript コードの実行を続ける。
  10. greeting() 関数をコールスタックリストから削除する。

    メモ: コールスタックリスト: 空

空のコールスタックで始め、関数を呼び出す度に、自動的にそれがコールスタックに追加され、コードをすべて実行した後、自動的にコールスタックから削除されます。最後に、またからのスタックで終了します。

より詳しく知る

一般知識