JS]実行コンテキスト(Execution Context)


🪵 定義#テイギ#


Execution context (abbreviated form — EC) is the abstract concept used by ECMA-262 specification for typification and differentiation of an executable code.
実行コンテキストは,実行可能コードを実行するために必要な環境といえる.
概念的には,アクティビティ実行コンテキストの集合がスタックを構成する.スタックの下部は常にglobal contextであり、上部は現在のアクティビティ実行コンテキストである.

🪵 Executableコードのタイプ


実行可能コードは4種類あります.
1. global code
2. function code
3. eval code
4. module code
実行コンテキストのスタックを配列として定義します.
ECStack = [];
スタックは関数に入るたびにプッシュされ、内蔵eval関数を実行するたびにプッシュされます.

Global Code


  • グローバルコードはProgram級で処理されています.たとえば、ロードされた外部.jsファイルまたは内部のインラインコード(<script></script>)で処理される.

  • グローバルコードには、関数内部のコードは含まれません.

  • プログラム起動時にECStackは以下のようになります.
  • ECStack = [
        globalContext
    ];

    Function Code

  • 関数コードに入るたびに、ECStackは新しい要素をリフレッシュします.この場合、関数内部の関数は含まれません.
    たとえば、
  • には、次の再利用可能な項目があります.
    (function foo(flag) {
      if (flag) {
        return;
      }
      foo(true);
    })(false);
    ECStackは以下のように変更されました.
    // first activation of foo
    ECStack = [
      <foo> functionContext
      globalContext
    ];
      
    // recursive activation of foo
    ECStack = [
      <foo> functionContext – recursively 
      <foo> functionContext
      globalContext
    ];
    最初のfoo関数が呼び出されると、foo関数コンテキストはECStackにリフレッシュされ、foo関数コンテキストは再びリフレッシュされます.
    ECStackは、関数から戻るたびに現在の実行コンテキスト(順次または逆)を終了します.
    プログラムが終了すると、ECStackはグローバルコンテキストのみを保持します.
  • 例外が投げ出されたが、キャプチャされていない場合でも1つ以上の実行コンテキストが終了する.
  • (function foo() {
      (function bar() {
        throw 'Exit from bar and foo contexts';
      })();
    })();

    Eval Code


    呼び出しコンテキストと呼ばれる方法、すなわち
  • eval関数を呼び出す方法がある.
  • eval関数によって作成されたアクションは、呼び出しコンテキストに影響します.
  • // influence global context
    eval('var x = 10');
     
    (function foo() {
      // and here, variable "y" is
      // created in the local context
      // of "foo" function
      eval('var y = 20');
    })();
      
    alert(x); // 10
    alert(y); // "y" is not defined
    
    このコードのECStackの変更は次のとおりです.
    ECStack = [
      globalContext
    ];
      
    // eval('var x = 10');
    ECStack.push({
      context: evalContext,
      callingContext: globalContext
    });
     
    // eval exited context
    ECStack.pop();
     
    // foo funciton call
    ECStack.push(<foo> functionContext);
     
    // eval('var y = 20');
    ECStack.push({
      context: evalContext,
      callingContext: <foo> functionContext
    });
     
    // return from eval 
    ECStack.pop();
     
    // return from foo
    ECStack.pop();

    🪵 サマリ


    概念的には、実行コンテキストは呼び出しスタックのようにスタックとして維持される.
    Def. 8: Execution context stack: An execution context stack is a LIFO structure used to maintain control flow and order of execution.
    実行コンテキストスタックには、コントロールフローと実行順序を維持するためのLIFO構造があります.
    ECMAScript codeには、global code、function code、eval code、module codeなど、さまざまなタイプがあります.各コードは、対応する実行コンテキストで処理されます.各コードタイプとそれらに適したオブジェクトは、実行コンテキストの構造に影響します.
    例えば、グローバル実行コンテキストにおける変数オブジェクト(VO)は、グローバルオブジェクトグローバルオブジェクト(GO)と呼ばれ、引数の情報は含まれない.逆に,関数コードで生成された関数実行コンテキストにおける変数オブジェクト(VO)は,パラメータとパラメータに関する情報を含むオブジェクト(AO)を活性化する.
    次の再帰関数呼び出しを見てみましょう.
    function recursive(flag) {
     
      // Exit condition.
      if (flag === 2) {
        return;
      }
     
      // Call recursively.
      recursive(++flag);
    }
     
    // Go.
    recursive(0);

  • グローバルコンテキストは常にスタックの下部にあります.グローバルコンテキストは、他のコンテキストを作成する前に作成されます.グローバルコンテキストは、アプリケーションが終了するまで維持されます.

  • 新しい関数が呼び出されると、新しい実行コンテキストが作成され、スタックにプッシュされます.この場合、この実行コンテキストはアクティブな実行コンテキストになります.

  • 関数が返されると、コンテキストがスタックからポップアップされます.

  • 他のコンテキストを呼び出すコンテキストを呼び出し者、呼び出すコンテキストを呼び出し者と呼びます.上記の例の再帰関数は、呼び出し元であり、呼び出し元でもあります.
  • リファレンス

  • ECMA-262-3 in detail. Chapter 1. Execution Contexts.
  • 実行コンテキストとJavaScriptの動作原理-poiemaweb