実行コンテキスト


Javascriptの勉強と整理をするよ。


ES 6からJavaScriptまでのプロセス全体を学習します.

Execution Context


実行コンテキストとは?
実行に必要なコードストリームの背景となる条件/環境を表します.
ES 5環境において、同じ条件/環境を有する場合は、関数またはグローバル空間である.
グローバルスペースは、JavaScriptファイルの実行時に開きます.
関数を実行するとき、または同じグローバル空間内で、同じ環境にあると考えられます.
JavaScriptの実行コンテキストをクリアします.
  • 関数の実行に必要な環境情報(条件)
  • 上の図1のオブジェクト
  • 次のコードを見て、console.ロゴが撮られる順番を予測します.
    var a = 1;
    
    function outer() {
      console.log(a); // (1)
    
      function inner() {
        console.log(a); // (2)
        var a = 3;
      }
    
      inner();
      console.log(a); // (3)
    }
    
    outer();
    console.log(a); // (4)
  • グローバルコンテキストが開きます.
  • のグローバルスペースを実行し、outer()関数に遭遇すると、outerという関数の実行コンテキストが開き、(1)回実行されます.
  • inner()に遭遇した場合、inner関数の実行コンテキストが開き、(2)回実行されます.
  • 以降は内部に対する実行が終了しているので(3)実行する.
  • 以降はouterの実行が終了しているので(4)実行する.
  • 上記の1~5号の実行はどのように発生し、処理されているのでしょうか。







    まず一番奥から、最後に入ってきたのは最も遠い曖昧な概念stackによって引き起こされた.
    実行に関与するスタックを呼び出しスタック(call stack)と呼び、この呼び出しスタックによって上述の操作が実行される.
    call stack:現在実行されている関数はどれですか.次に、呼び出す必要がある関数のデータ構造を制御します.

    Execution Contextの構成



    まず、上のコードから内部を表示します.
    VariableEverronmentとLexcialEnvironmentで構成されています.

    Variable Environment

  • が最初に作成され、初期接触情報のスナップショットのみが表示され、その後値が変更された場合、変更された値は適用されず、初期値のみが保持されます.
  • Lexical Environment

  • 以降、値が変更されるたびに、変更された値が反映されます.
  • Lexical Environment


    LexicalEnvironmentには、環境レコードと外部環境リファレンスが含まれています.
    私たちはこの2つの状況を理解します.

    environmentRecord


    EnvironmentRecordとは、現在のコンテキストを収集して含む識別子です.
    これは別の言い方でHostingと呼ばれています.

    Hoisting


    識別子情報を実行コンテキストの上部にドラッグします.
    次のコードを見て、どんな識別子があるか、転送方法を見てみましょう.
    console.log(a());
    console.log(b());
    console.log(c());
    
    function a() {
      return 'a';
    }
    
    var b = function bb() {
      return 'bb';
    }
    
    var c = function() {
      return 'c';
    }
    まず,上のコードにはa,b,cを識別子としているので,それを上に引く.
    関数宣言文の場合は、関数全体を明確に昇格させる必要があります.
    function a() {
      return 'a';
    }
    
    console.log(a());
    console.log(b());
    console.log(c());
    
    var b = function bb() {
      return 'bb';
    }
    
    var c = function() {
      return 'c';
    }
    次に、b、cへの案内を完了し、以下に示す.
    function a() {
      return 'a';
    }
    
    var b;
    var c;
    
    console.log(a());
    console.log(b());
    console.log(c());
    
    b = function bb() {
      return 'bb';
    }
    
    c = function() {
      return 'c';
    }
    環境記録は次のとおりです.
    {
      function a() {...},
      b, 
      c
    }
    上記のような形で情報を収集する.현재 전역 콘텍스트에 선언되어진 식별자들이 무엇이 있는 지?を探して順番に情報を収集すると、ハウスティンと同じ概念になったという.

    outerEnvironmentReference


    これは、外部環境への参照が、現在の実行コンテキストに関連する外部実行コンテキストの識別子情報を収集することを意味する.

    SCOPE


    :変数の有効範囲
    変数の有効範囲はexecution contextによって生成されます.すなわち、実行コンテキストによって収集された情報にのみアクセスでき、この変数は実行コンテキスト内にのみ存在する.

    内部からouter、グローバルの変数にアクセスできます.
    ただし、outerまたはグローバルに参照されていないオブジェクトのため、内部宣言された変数にアクセスできません.
    LexicalEnvironmentから収集された情報がないため、内部に書き込まれた変数にアクセスできません.
    すなわち、変数の有効範囲は実行コンテキストによって作成され、scopeチェーンも最終的に実行コンテキストによって決定される.