JavaScriptがどのように実行されるかについてまとめました。
JavaScriptの実行環境
JavaScriptはJavaScriptエンジンで実行される。
JavaScriptエンジンはJavaScriptのコードを解析してコンパイルし実行するプログラム。
JavaScriptエンジン上でECMAScriptやWebAPIs(ブラウザ上)が動作する。
V8というGoogleが提供しているオープンソースのJavaScriptエンジンのシェアが多い。
JavaScriptのコードがどのように実行されるか
コードの実行前
JavaScriptエンジン上でJavaScriptのコードが動作する。それに加えてコードの実行前にはグローバルオブジェクトとthis
が用意される。
グローバルオブジェクトは実行環境によって異なり、ブラウザ上ではWindow
オブジェクトとなり、その中にWebAPIsが含まれる。
実行コンテキスト
実行コンテキストとはコードが実行されている状況のこと。コードが実行されている状態によってコンテキストは変化する。
実行コンテキストにはグローバルコンテキスト、関数コンテキスト、eval
コンテキストの3つの種類がある。eval
コンテキストは非推奨なので、重要なのはグローバルコンテキストと関数コンテキスト。
グローバルコンテキスト
グローバルコンテキストでは以下の3つが使える。
- 実行中のコンテキスト内の変数や関数
- グローバルオブジェクト
this
グローバルコンテキストでの実行中のコンテキスト内の変数や関数はグローバルスコープにあたる。
this
は実行コンテキストによって参照先のオブジェクトが変わる変数のようなもの。
関数コンテキスト
関数コンテキストは関数が実行されているときのコンテキストで、以下の5つが使える。
- 実行中のコンテキスト内の変数や関数
arguments
super
this
- 外部変数
関数コンテキスト内での実行中のコンテキスト内の変数や関数は関数スコープにあたる。
arguments
は関数に与えられた引数がすべて格納された、関数の中でのみ参照できる特殊な変数。
super
は継承元の関数を呼び出す特殊なキーワード。
外部変数は外側のスコープにある変数のこと。
コールスタック
コールスタックは、コードがどの順番で実行されたかの履歴を表すようなもの。
コールスタックの中に新しく作成されたコンテキストが積まれていき、実行中のコンテキストが一番上にくる。実行が完了したコンテキストから消滅していき、最終的にはコールスタックの中身は空になる。
具体的には、最初に必ずグローバルコンテキストが作られ、コードが上から順番に実行されていく。その途中で関数があれば関数コンテキストが作られる。
function a() { } function b() { a() } function c() { b() } c()
上記のコードは以下のような順番でコールスタックが積まれて消滅する。
- 最初にグローバルコンテキストが作られる
- コードが上から読まれてcの関数が実行され、cの関数コンテキストが作られる
- cの中で実行されたbの関数コンテキストが作られる
- bの中で実行されたaの関数コンテキストが作られる
- aの実行が完了してaの関数コンテキストが消滅する
- bの実行が完了してbの関数コンテキストが消滅する
- cの実行が完了してcの関数コンテキストが消滅する
このように後入れ先出しの仕組みになっている。
まとめ
- JavaScriptはJavaScriptエンジンで実行される
- JavaScriptのコードを実行する前にグローバルオブジェクトと
this
が用意される - JavaScriptのコードが実行されるとグローバルコンテキストが作られ、関数が実行されると関数コンテキストが作られる
- コールスタックにコンテキストが後入先出しの仕組みで積まれていく