パレット


スキャン


定義
  • :有効識別子範囲
  • スコフとクロゼは非常に密接な関係を持っている.

    鉛筆の鎖。


    定義
  • :「識別子の有効範囲」を内から外へ順に検索します.
  • 次のコードでは、スキャンチェーンの概念を使用しています.
    var globalColor = 'red';
     
    function foo() {
        var fooColor = 'blue';
     
        function bar() {
            var barColor = 'yellow';
     
            console.log(barColor); // yellow
            console.log(fooColor); // blue
            console.log(globalColor); // red
        }
        bar();
    }
    foo();
    LexicalEnvironmentは2つの部分に分かれています.
    1.環境記録(Environment Record)-識別子を格納する場所
    2.外部環境参照(Outer Environment Reference)-
    内層関数がネストされた関数で自分のディレクトリ環境を検索すると、変数値が見つかりません.
    ->外部関数のLexical環境を参照してください.もしそれがなかったら?
    ->外部のLexical環境を参照します.
    このようにLexical環境がnullになるまで参照を続けてきたのがScopeチェーンである.
    下図のようにチェーンのように編んで参照します.

    上の2つをもっとよく知ってください.
    A関数でB関数を宣言し、C関数を再度宣言します.
    function A(){
      var a = 1;
      function B() {
        console.log(a);
        function C() {
          console.log(a);
        }
      }
    }
    Lexcial Environment(Lexcial Environment)ディレクトリ環境には2種類あります.
  • 環境記録:識別子を記憶する
  • 外部環境リファレンス:現在呼び出されている関数の宣言時のディレクトリ環境.関数外部環境
  • 関数CのouterEnvironmentReferenceは、関数Bのディレクトリ環境を参照します.
    関数Bのディレクトリ環境のouterEnvironmentReferenceは、関数Bが再宣言したとき(A)のディレクトリ環境を参照する.
  • 宣言ポイントのディレクトリ環境を探し続けると、最後にグローバルコンテキストのディレクトリ環境があります.
    各外部環境リファレンスは、宣言時に存在するディレクトリ環境のみを参照するため、最近の要素から順次アクセスでき、他の順序でアクセスできません.このような構造特性のため、複数のスキャンで同じ識別子が宣言されると、スキャンチェーンで最初に発見された識別子に無条件にアクセスするしかない.
  • スキャナは通常{}を基準とすることができる.
    const a = 1;
    {
    const a = 2;
    console.log(a); (1)
    }
    console.log(a); (2)
    (1)行はスキャン内に変数aがあるので,直接2を出力する.でも.
    もしスコップリーに変数aがなかったら?
    const a = 1;
    {
    console.log(a);//顕微鏡内には変数aがないので,外で最も近い変数が見つかる.これがスコフチェーンです.
    }
    console.log(a);

    すいじゅんけい

  • 関数スキャン
  • ブロックスキャンブロック
  • 種類

  • 戦区スキャン:街の外にあります.
  • エリアスキャン:ブロック内にあります.
  • エンクロージャ

  • ある関数に囲まれた環境を記憶する
    これはあいまいな解釈だ.モジュールを理解するためには,まずscope概念を理解する必要がある.
  • )

  • は閉じた場所ですが、接続の一環でGCはメモリからデータを削除しません.
  • 、空き容量がある場合は
  • は削除されません.
    次のコードに注意してください.
    私はこのコードで一度にCloserとScopeチェーンをつかむことができます.
    if(1 < 2) {
      function f = function() {
     	let abc = 123;
        let ddd = function() {
        	return abc; // 스코프체인에 의해 abc가 스코프에 없으니 상위 스코프 뒤짐.
        }
        return ddd;
      }
     }
    
    const ccc = f();
    console.log(ccc()); /// 123

    最初のfor文でarr[i]にマッピングされた値は特定の値ではなくfunction(){return i}である.という名前の関数です.この関数には領域変数がないため、後で実行すると独自のスキャン範囲から飛び出し、上位スキャンでiを参照しますが、関数の実際の実行時の2番目のfor文では、i値はすでに1番目のfor文の終了時の値なので5です.(varと宣言されたため、ブロックスキャン後もiは保持される)すべての結果値は5に統一される.