JavaScriptの実行環境まとめ

JavaScriptがどのように実行されるかについてまとめました。

JavaScriptの実行環境

JavaScriptJavaScriptエンジンで実行される。

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()

上記のコードは以下のような順番でコールスタックが積まれて消滅する。

  1. 最初にグローバルコンテキストが作られる
  2. コードが上から読まれてcの関数が実行され、cの関数コンテキストが作られる
  3. cの中で実行されたbの関数コンテキストが作られる
  4. bの中で実行されたaの関数コンテキストが作られる
  5. aの実行が完了してaの関数コンテキストが消滅する
  6. bの実行が完了してbの関数コンテキストが消滅する
  7. cの実行が完了してcの関数コンテキストが消滅する

このように後入れ先出しの仕組みになっている。

まとめ

  • JavaScriptJavaScriptエンジンで実行される
  • JavaScriptのコードを実行する前にグローバルオブジェクトとthisが用意される
  • JavaScriptのコードが実行されるとグローバルコンテキストが作られ、関数が実行されると関数コンテキストが作られる
  • コールスタックにコンテキストが後入先出しの仕組みで積まれていく