taquaki-satwo
11/19/2017 - 12:45 PM

インタプリタの実行順序

1. グローバルオブジェクトの生成

ブラウザでは window オブジェクト

  • グローバルオブジェクトのプロパティ
    • グローバルプロパティ
      • undefined
      • NaN
      • Infinity
    • コンストラクタ関数
    • グローバル変数
    • 組み込みオブジェクト

2. プラグラムの評価

  1. グローバル変数がグローバルオブジェクトのプロパティに追加される
    • undefinedが代入される
  2. 関数宣言文から関数オブジェクトが生成される
    • 関数名を変数名とするグローバル変数がグローバルオブジェクトのプロパティに追加される
    • 関数オブジェクトへの参照が代入される

グローバルオブジェクトとcallオブジェクトを変数オブジェクト(Variable Object)という プログラム評価時に生成されるものを静的といわれる -> どの位置に記述記述してもプログラムから参照できる -> 巻き上げ

3. プログラムの実行

  1. プログラムが実行されると関数コードごとに実行コンテキストが生成される
    • 実行コンテキストはコールスタックにスタックされる
  2. 関数の実行
    • ローカル変数を格納する変数オブジェクトが生成される -> callオブジェクト
    • callオブジェクトのプロパティ
      • 関数の仮引数 -> 実引数の値が格納される -> ない場合はundefined
      • 関数内の関数宣言文で定義されたローカル変数 -> 関数オブジェクトへの参照が代入される
      • 関数内で宣言されたローカル変数 -> undefinedが代入される
      • arguments -> 実引数の値の全リスト、lengthプロパティ、calleeプロパティが格納される
      • 呼び出し元の変数オブジェクトへの参照 -> スコープチェーンによって変数の名前解決が行わる
  3. thisが値が決定される

関数が実行され呼び出し元に戻るとcallオブジェクトはメモリから解放される(クロージャの場合はメモリに残る)