概要
本記事では、JavaScriptのコンセプトであるコールスタックについて整理します。
コールスタックとは
コールスタックは、JavaScirptを実行するインタプリタ(WebブラウザのJavaScriptインタプリタなど)が複数の関数を呼び出すスクリプト内の場所を追跡するためのメカニズムです。
JavaScriptの実行は、基本的にはシングルスレッドによるヒープと単一のスタック呼び出しから構成されます。
基本原則は以下となります
1. シングルスレッド。つまり、一度に一つのことしかできないということ。
2. コード実行は同期的。
3. 関数呼び出しは一時メモリを占有するスタックフレームを作成。
4. LIFO – 後入れ先出しデータ構造として機能。
処理の流れ
スクリプトが関数を呼び出すと、インタプリタはそれを呼び出しスタックに追加してから、その関数の実行を開始します。
↓
その関数によって呼び出されたすべての関数は、さらに呼び出しスタックに追加され、それらの呼び出しに到達した場所で実行されます。
↓
現在の関数が終了すると、インタプリタはそれをスタックから取り除き、最後のコードリストで中断したところから実行を再開します。
スタックオーバーフロー
スタックが割り当てられていたよりも多くのスペースを占有すると、「スタックオーバーフロー」エラーが発生します。
下記のように、自身の関数を再帰的に呼び出すことが原因となります。
参考
Call Stack
https://developer.mozilla.org/en-US/docs/Glossary/Call_stack
Understanding the JavaScript call stack
https://medium.freecodecamp.org/understanding-the-javascript-call-stack-861e41ae61d4