13分光鏡


スキャン

  • すべての識別子(変数名、関数名、クラス名など)は、宣言された位置によって、他のコード参照識別子自体の有効範囲を決定する->識別子有効範囲
  • .
    Lexical Environment(語彙環境):コードがどこで実行されているか、周囲にどのようなコードがあるかを判断します.
    コードコンテキスト(context):ディレクトリ環境
    実行コンテキスト(execution context):実装文
  • 識別子:任意の値を識別する一意の名前(一意)
  • function foo() {
      var x = 1;
      var x = 2;
      console.log(x); //2
    }
    
    function bar() {
      let y = 1;
      // let이나 const 키워드로 선언된 변수는 같은 스코프에서 중복 선언을 허용하지 않음
      let y = 2; // SyntaxError
    }
    bar(); 

    1.顕微鏡の種類


    グローバルおよびグローバルスキャン
  • 戦区
    -コードの一番外側の領域
    -スキャン:グローバルスキャン
    -変数:グローバル変数
    グローバル変数
  • は任意の場所で参照できます.
    ゾーンとゾーンスキャン
  • 地区
    -関数内
    -スキャン:ゾーンスキャン
    -変数:領域変数
    領域変数は、その領域とサブ領域の範囲内で有効である
  • .
    // 전역 스코프
    var x = 'global x';
    var y = 'global y';
    
    function outer() {
      // 지역 스코프
      var z = 'outer local z';
      console.log(x); // global x
      console.log(y); // global y
      console.log(z); // outer local z
      
      function inner() {
        // 지역 스코프
      	var x = 'inner local x';
        
        console.log(x); // inner local x
        console.log(y); // global y
        console.log(z); // outer local z
      }
      
      inner();
    }
    
    outer();
    
    console.log(x); // global x;
    console.log(z); // ReferenceError : z is not defined 

    2.スコフ鎖

  • 関数はオーバーラップ可能であるので、関数の領域スキャンもオーバーラップ可能である
    ->ネスト関数を持つ階層
  • 範囲チェーン:範囲チェーン階層接続
  • 変数を参照する場合は、スキャンチェーンを介して変数を参照するコードのスキャンから上方向に移動し、宣言された変数
  • を検索する.
  • 親鏡の有効変数は子鏡で自由に参照できるが、子鏡の有効変数は親鏡で
  • を参照できない.
  • カスケード階層は、親子関係の継承
  • に類似する.
    スキャンチェーンサーチ関数
    function foo() {
      console.log('global function foo');
    }
    
    function bar() {
      function foo() {
        console.log('local function foo');
      }
      foo(); // local function foo
    }
    
    bar();

    かんすうレベルそうさ

  • 領域は関数体内を表し、地理的スキャンを作成する:非コードブロックの関数のみから領域スキャン
  • を生成する.
    ブロックレベルスキャン(block level scope):関数ボディだけでなく、すべてのコードブロック(if、for、while、try/catch)
    関数レベルスキャン(function level scope):varキーワードとして宣言された変数は、関数のコードブロック(ボディ)のみをドメインスキャンとして承認します.
    // ex1)
    var x = 1;
    if (true) {
      // var로 선언된 변수는 함수의 코드 블록만을 지역 스코프로 인정
      // 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 선언되었어도 모두 전역 변수임
      // 의도치 않게 변수 값이 변경되는 부작용 발생
     var x = 10;
    }
    console.log(x); // 10
    
    // ex2)
    
    var i = 10;
    // for문에 선언한 i는 전역변수, 이미 선언된 i가 있으므로 중복 선언
    for (var i = 0; i < 5; i++) {
     console.log(i); // 0 1 2 3 4
    }
    //의도치 않게 변수의 값이 변경됨
    console.log(i); // 5

    でんしけんびきょう

  • 親スキャン:
  • 呼び出し
  • 関数の位置は親スキャン決定
  • に影響しない.
  • 関数の親スケールは、常に定義されたスケール
  • である.
  • 関数の親スキャンは、関数定義実行時に静的に決定する
  • である.
    var x = 1;
    function foo() {
     var x = 10;
     bar();
    }
    
    function bar() {
     console.log(x);
    }
    
    foo(); // 1
    bar(); // 1
    📖 参考図書:モダンJavaScript Deep Dive JavaScriptの基本概念と動作原理