実行コンテキスト



実行コンテキストは

  • 実行コンテキストは、実行するコードで提供される環境情報を含むオブジェクト
  • である.
  • は、同じ環境のコードを実行するために必要な環境情報を収集し、
  • を構成する.
  • コンテキストは、Call Stackにおける
  • に順次積み重ねる.
    最高コンテキストに関連するコード
  • を実行
  • の完全なコードを確保する環境と順序
  • 実行コンテキストの構成方法

  • グローバルスペース→自動運転
  • eval()関数の使用は推奨されません→
  • 関数→最も一般的な実行コンテキスト構成方法
  • ブロック→  { }  積み重ねられたコードの内部.ES 6から
  • をサポート

    コンテキストと呼び出しスタックの実行


    サンプルコード

    // ------------------- (1)
    var a = 1;
    function outer() {
      function inner() {
        console.log(a);
        var a = 3;
        // --------------- (2)
      }
      inner(); // -------- (3)
      console.log(a);
      // ----------------- (4)
    }
    outer(); // ---------- (5)
    console.log(a);
    // ------------------- (6)
  • 実行順:(1)→(5)→(3)→(2)→(4)→(6)
  • コールスタック変化



    収集アクティビティの実行コンテキストについて

  • VariableEnvironment
  • environmentRecord (snapshot)
  • outerEnvironmentReference (snapshot)
  • LexicalEnvironment
  • environmentRecord
  • outerEnvironmentReference
  • ThisBinding-この識別子が注目すべきターゲットオブジェクト
  • VariableEnvironment

  • に含まれるコンテンツはLexicalEnvironmentと同じですが、初期実行時のスナップショット
  • は保持されます.
    作成
  • 実行時には、まずVariableEnvironmentに情報を書き込み、その後LexicalEnvironmentにコピーし、次に主にLexicalEnvironmentを利用する
  • 内部コンポーネント: 現在のコンテキスト内の識別子の情報+外部環境情報を宣言ポイントのスナップショットとして保存
  • environmentRecord (snapshot)
  • outerEnvironmentReference (snapshot)
  • LexicalEnvironment

  • 内部コンポーネント: VariableEnvironmentと同じですが、変更はリアルタイムで反映されます.
  • environmentRecord
  • outerEnvironmentReference
  • 環境記録とブート(アップグレード)


    environmentRecord

  • 現在のコンテキストに関連するコードの識別子情報を格納する
    構成
  • コンテキストの関数で指定された パラメータ識別子
  • 宣言関数 関数自体
  • varと宣言された 変数の識別子
  • コンテキストで最初から最後までブラウズし、
  • を順番に収集する.
  • グローバル実行コンテキスト
  • 変数オブジェクトの代わりにJavaScriptによって駆動される環境で個別に提供されるグローバルオブジェクトを使用して
  • を作成します.
  • ブラウザのwindow,Node.
  • jsのglobalオブジェクトを含む
  • は、内蔵(ネイティブ)オブジェクトではなく、ホスト(ホスト)オブジェクトとして分類します.
  • ハウステンボスの登場

  • 変数情報を収集するプロセスが完了している場合は、JavaScriptエンジンは、コードが実行される前に、その環境内のコードのすべての変数名を知っています.
  • 「javascriptエンジンは識別子を最上位に引き出し、実際のコードを実行する」が、コード解釈に問題はない
  • この過程で、ハウスティンの概念
  • が現れた.

    ハウスティンの概念

  • 号昇格:昇格(昇格)+~ing→識別者を最上位に昇格、
  • 仮想概念
  • は、変数情報を収集するプロセスに代わって、より理解しやすい方法で置き換えられる.
  • javascriptエンジンは実際にはアップグレードされていませんが、便利なアップグレードと見なしています.
  • 変数は、宣言および割当部分のみを宣言に昇格させます. 関数全体
  • 号ポーリング終了時の関数宣言は、(*)関数名として宣言された変数に関数
  • が割り当てられていると考えられる.

    関数宣言文と関数式

  • 関数宣言:関数定義子のみが存在し、個別の割り当てコマンドはありません.
  • 関数全体
  • を上げる
  • 関数式:定義された関数を別の変数に割り当てる
  • 匿名関数式:関数名を定義しない
  • 記名関数式:関数名の定義
  • 関数名から
  • を呼び出すことはできません.
  • 内部 再帰関数の呼び出しに使用します.ただし変数名で呼び出すこともでき、
  • を書く必要はないように見えます.
  • 番転送時は変数とみなされます. ドラッグアンドドロップ宣言部
  • のみ
    function a() { /* ... */ } // 함수 선언문. 함수명 a가 곧 변수명
    a(); // 실행 가능
    
    var b = function () { /* ... */ } // (익명) 함수 표현식. 변수명 b가 곧 함수명
    b(); // 실행 가능
    
    var c = function d() { /* ... */ } // (기명) 함수 표현식. 변수명은 c, 함수명은 d
    c(); // 실행 가능
    d(); // 실행 불가능. 에러!
    コード上部宣言
  • 関数宣言の場合、下部で同じ名前の関数宣言を繰り返し使用すると、予期せぬ
  • が発生する可能性があります.

    外部環境リファレンス


    ひょうじチェーン

  • 現在スキャンで宣言されていない識別子がある場合は、親スキャンに移動して
  • を検索します.
  • が複数のscopeで同じ識別子を宣言した場合、 スキャンチェーンで最初に検出された識別子のみに無条件にアクセス 可能性
  • 変数非表示 : 宣言は親スキャンにありますが、現在宣言されている場合は値が指定されます. 
  • var a = 1;
    var outer = function() {
      var inner = function() {
        console.log(a); // (1)
        var a = 3;
      };
      inner();
      console.log(a); // - (2)
    }
    outer();
    console.log(a); // --- (3)
  • (1)内の関数コンテキストには識別子が存在するが、値は指定されていない.  undefined  出力
  • (2)outer関数コンテキストにはa識別子が存在しないため、outerEnvironmentReferenceに従ってグローバルコンテキストのaで見つけることができます.  1出力
  • (3)グローバルコンテキストに識別子と値が存在する.  1  出力