スキャン


poiemawebを参照
スキャン
  • 識別子の有効範囲
  • 他のコード参照変数自体の範囲
  • JavaScriptエンジン識別子検索時に使用するルール
  • 識別子変数名の競合を防止する
  • .
    関数のみで生成され、
  • グローバルスペースは含まれません(varキーワードを使用する識別子のみ)
  • コードの一番外側の領域:グローバル
  • 関数内部:地域
  • ex)関数のパラメータは、関数本体内部でのみ参照でき、外部では参照できません
    function add(x, y) {
      // 매개변수는 함수 몸체 내부에서만 참조할 수 있다.
      // 즉, 매개변수의 스코프(유효범위)는 함수 몸체 내부다.
      console.log(x, y); // 2 5
      return x + y;
    }
    
    add(2, 5);
    
    // 매개변수는 함수 몸체 내부에서만 참조할 수 있다(함수 외부에서는 유효하지 않기때문)
    console.log(x, y); // ReferenceError: x is not defined
    変数は、宣言された位置によって独自の有効範囲を決定します.すなわち、他のコードは変数自体の範囲を参照できます.変数だけでなく、すべての識別子です.すなわち、すべての識別子(変数名、関数名、クラス名など)は、宣言された位置によって、他のコード参照識別子自体の有効範囲を決定する.それをひっくり返す.すなわち,スキャンは指標識別子の有効範囲である.
    var x = 'global';
    
    function foo() {
      var x = 'local';
      console.log(x); // 'local'
    }
    
    foo();
    
    console.log(x); // 'global'
    変数xは、変数名が同じであるがscopeが異なるため、グローバルおよびfoo関数内でそれぞれ宣言される.
    変数xを参照する場合は、Scopeを内から外へ順に検索し、宣言した変数を最近の場所で参照します.従ってfoo関数内部console.log(x)のx変数は「local」値を参照する.
    最後の行のグローバル空間では、console.log(x)のx変数は、グローバルスキャンで宣言されたxを参照する.
    これによりjavascriptエンジンは、スキャンによってどの変数を参照すべきかを決定できます.
    ゾーンスキャン
    領域とは、関数体の内部を指します.ゾーン作成ゾーン範囲(localscope).領域に変数を宣言すると、領域スキャンを持つ領域変数(localvariable)になります.領域変数は、宣言された領域とサブ領域(オーバーラップ関数)でのみ参照できます.すなわち,領域変数は自分の領域スキャンとサブ領域スキャンで有効である.自分が主張する地域の上位ミラーの下では,自分の変数を参照することはできない.すなわち,外部関数は内部関数で宣言された変数を参照できない.(letとconstキーを使用する変数は適用されません)
    ひょうじチェーン
    関数は、グローバルで定義することも、関数ボディの内部で定義することもできます.関数体の内部で定義されている関数を「関数の重ね合わせ」と呼びます.一方、関数体の内部で定義されている関数は「ネスト関数」と呼ばれ、ネスト関数を含む関数は「外部関数」と呼ばれます.
    オーバーラップ関数の領域スキャンとオーバーラップ関数を含む外部関数の領域スキャンには階層があります.このとき,外部関数の領域走査を重畳関数の位相走査とする.
    内から外へ順に識別子を検索する有効範囲をスキャンチェーンと呼ぶ.
    // 전역 공간
    var a = 1;
    var outer = function() {    // 외부 함수
      var inner = function() {  // 내부 함수
        console.log(a);
        var a = 3;
      };
      inner();
      console.log(a);
    };
    outer();
    console.log(a);
    
    // 출력:
    // undefined
    // 1
    // 1
    // 계층 구조
    // inner 지역 스코프 -> outer 지역 스코프 -> 전역 스코프
    上のコードのスキャンチェーンは、トップスキャンベースのグローバルスキャン、グローバル宣言outer関数の領域スキャン、outer関数内部宣言のinner関数の領域スキャンから構成されます.
    outer関数のconsole.log(a);は、グローバルscopeで宣言された変数aを参照するため、1を出力します.
    参照する変数が自分の範囲内でない場合は、親の範囲内でナビゲートします.
    親スキャンマップにもない場合は、次の親スキャンマップをナビゲートし、スキャンチェーン上で順次ナビゲートし、最初に発見された識別子にアクセスして参照します.
    (サブスキャンにアクセスせずに親スキャン方向にナビゲートする必要があります.)
    かんすうレベルそうさ
    varキーワードとして宣言された変数は、関数のコードブロック(関数体)が領域コードであることのみを認めます.これらの特性を関数レベルスキャン(functionlevelscope)と呼ぶ.
    var x = 1;
    
    if (true) {
      // var 키워드로 선언된 변수는 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정한다.
      // 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 선언되었다 할지라도 모두 전역 변수다.
      // 따라서 x는 전역 변수다. 이미 선언된 전역 변수 x가 있으므로 x 변수는 중복 선언된다.
      // 이는 의도치 않게 변수 값이 변경되는 부작용을 발생시킨다.
      var x = 10;
    }
    
    console.log(x); // 10
    if文に宣言された変数xがグローバル変数として宣言される場合、if文のブロック領域が領域scopeであることを認めないためです.同じscope内で同じ名前の変数を宣言すると、2番目の宣言では、再割り当てのようにvarがないと表現されます.したがって、後に割り当てられる10はxの値である.
    でんしけんびきょう
    JavaScriptはLexical Scopeに従うため、関数がどこから呼び出されるかではなく、関数がどこで定義されるかに基づいて親Scopeを決定します.関数呼び出しの場所は、親スキャンの決定には影響しません.すなわち,関数の位相スケールは常に自己定義のスケールである.
    この関数の位相走査は,関数定義運転時に静的に決定される.関数定義(関数宣言または関数式)を実行して生成された関数オブジェクトは、このように決定された親スキャンを記憶します.関数を呼び出すたびに、関数の親スキャンを参照する必要があるためです.
    var x = 1;
    
    function foo() {
      var x = 10;
      bar();
    }
    
    function bar() {
      console.log(x);
    }
    
    foo(); // 1
    bar(); // 1