コンテキストの実行


コンテキストの実行


実行コンテキストは、コードを実行するために必要な環境です.
画像ソース、コンテンツリファレンスサイト
JavaScript呼び出しスタックでコードを処理することを知っています.
このcall stackに積み上げられているのは関数です.蓄積は内部論理を実行することを意味しない.
この関数を実行するには、必要なものがあります.
作成した関数を正しく実行するには、関数の内部で使用される変数や伝達されるパラメータ、内部関数、その関数のスキャン状況などの情報がどこかに宣言されている場合に限られます.
これらの情報を含む環境(スペース)は、「実行コンテキスト」です.
実行コンテキストとは,コード実行に必要な環境である.

コンテキストスタックの実行


ブラウザがオフになるまで、グローバルECは消えません.
コールスタックと同じように見ればいいです.スタック形式で呼び出された関数は、必要な環境を生成し、終了すると破棄されるためです.

「実行コンテキスト」(Execution Context)スタックは「呼び出しスタック」のように関数単位でスタックされ、終了すると実行コンテキストは消えます.

実行コンテキストの設定


より詳細な実行コンテキストの抽象的な構成をブログから理解すると役立ちます.
実行コンテキストは、関数で使用される変数、引数、パラメータ、および内部関数をオブジェクトとして管理する可変オブジェクトです.
Scope Chainはこの関数のスキャン情報を含む
現在のコンテキストを指すthisオブジェクトからなります.
一つ一つ見てみましょう.

Variable Object


パラメータの違い==両者が異なる.
VOは、変数、パラメータ、パラメータ、および内部関数宣言に関する情報を提供する.
しかし、これはVOに格納されているわけではありません.格納された空間はアクティブオブジェクトであり,VOはAOを指す参照者である.

関数コンテキストはAOを指し、グローバルコンテキストはパラメータが欠けているGOを指す.それ以外は同じです.

Scope Chain


スコットランドとは、特定の場所に変数を格納し、変数と関数を検索するために必要なルールです.
前の文章では「スコフにa, bがあるかどうかを聞いたら、ないならスコフコレクションに入れて、あるならひどい」と話しています.
この操作を行う時点はコンパイル時間であり、フィルタリングフェーズでスキャン時間が決定されます.
何度も聞いたことがありますが、よくわからないのがその「Lexicalscope」です.
JSのスケーリングはレックスタムによって決定されるため、「レクシースケーリング」に従うと言われています.
関数の宣言がどこに宣言されるかによって,変数や関数のscopeはLexical scopeによって決まると考えられる.
Scope chainはその名の通りScopeが接続され、リストの形式を形成しています.
Scope Chainのノードが指すオブジェクトは、その親関数、またはグローバル実行コンテキストのVOが指すオブジェクトです.
複雑すぎる
ハーモニーで見よう
var x = 'xxx';

function foo () {
  var y = 'yyy';

  function bar () {
    var z = 'zzz';
    console.log(x + y + z);
  }
  bar();
}
foo();
foo関数にはbar関数が定義されています.
barのAOにないx,yを参照するために,自分を自分を囲む親関数に回して確認する.
このとき使うのがScope Chainです.
fooのコンテキストでは,voが指すaoにyに関する情報が記録されている.
barのScope Chainはfooとグローバルを指すリストです.
現在のコンテキスト(bar)を参照する変数がAOにない場合は、Scopechainが指す親(foo,グローバル)AOで検索して使用します.
これを「ScopeChaining」といいます.

this


その他の内容は単独で議論します.
関数だけでなく、現在のコンテキストのオブジェクトを指します.
これは、関数の呼び出し方法に依存します.

コンテキスト作成順序の実行


実行コンテキストの作成順序は固定され、次の順序に従います.
  • Scope Chain
  • の作成と初期化
  • 可変オブジェクト化
  • この決定
  • Scope Chainの作成と初期化


    関数の実行後、SCの最初の値をAOに設定します.

    リスト形式Scope Chainの最初のノードはVOが指すAOである.
    そして、呼び出しfooのコンテキストのAO foo propertyのfunctionobjectvalueで指定された[[scope]]の値に従って、現在のコンテキストのSCに追加される.

    AOに関数を追加すると、[[scope]]の属性を持つ関数オブジェクトが割り当てられます.[[scope]]とは、この機能オブジェクトを実行する環境(写真ではGO)を指す.
    この関数を実行して新しいコンテキストを作成すると、[[scope]]に基づいてScope Chainに追加されます.(写真には赤い1の指すGOSコフノードが追加されています.)

    可変オブジェクト化の実行


    SCフェーズが終了すると、このフェーズが実行される.
    これは,関数や変数などをVOが指すAOやGOに格納する段階である.
    AOに追加する手順は次のとおりです.
  • Parameter
  • 関数宣言
  • 変数宣言
  • ステップ2,3では,関数をAOに最初に追加する.宣言を先に処理する.がんばってください.
    実行コンテキストが生成されると、AOに登録された宣言は護送である.
    また、関数は変数の前に登録されるため、関数には関数のシース->変数のシースの順序があります.

    この決定


    処理終了を宣言した後、この点を決定します.

    整理する


    JSはコンパイルされた.
    コードの実行時にコンテキストによって生成され、定義されます.
    グローバルコードにグローバルコンテキストを作成し、関数に関数コンテキストを作成します.
    コンパイルの過程で、宣言の内容を決定する.
    このとき決めたのはLexicalScope.
    関数が実行されると、グローバルと同じ実行コンテキストが生成され、まず親コード[[scope]]に基づいてScope Chainが生成され、初期化される.
    その後、VOオブジェクト化を行い、使用する関数や変数などの情報をAOに登録する.
    同様に、宣言から処理するので、転義が発生します.関数->変数の順序
    最後に、コンテキストを指すthis値を決定し、コードを実行します.
    コンテキストで参照される変数がAOに含まれていない場合、Scope Chainに従って値を指す親AOにアクセスします.
    グローバルコンテキストにリンクし、ない場合はnullを返します.