[JS]-スキャン(scope)


Scope ?


🌟 各定数や変数などの要素の領域、範囲を許可します.
  • 変数のアクセス性を管理する概念.グローバル(グローバル)と地域(ローカル)
  • を含む.

    1グローバルスキャン

  • グローバル範囲内で変数を宣言する場合
  • 任意のブロックからアクセス可能
  • let name = "hyelin"; 
    function print(){
    	console.log(name); // hyelin
    }
    print();
    console.log(name); // hyelin
  • name宣言グローバル変数
  • print関数ブロック内出力の値はブロック外出力の値と同じ
    👉🏻 グローバル範囲として宣言された変数
  • 2”エリア(ローカル)スキャン

  • ブロックに変数が宣言されている場合
  • したがってブロック内部からのみアクセス可能
  • const color = 'blue'
    const returnColor = () => {
      const color = 'red'
      return color;
    };
    console.log(returnColor()); // red
  • 出力関数で宣言された値は、グローバル変数があるためですが、最近の変数
  • に従います.
  • 関数に変数がない場合、グローバル検索変数
  • したがって、できるだけグローバル変数を避け、領域変数を使用することが望ましい.
    👉🏻 グローバル変数は、任意の場所からアクセスおよび変更できます
  • 🌟 グローバル変数を最小化する方法


    1朕グローバル変数オブジェクトの作成と使用

    const MYAPP = {};
    
    MYAPP.student = {
      name: 'Lee',
      gender: 'male'
    };
    
    console.log(MYAPP.student.gender);
    
    ###2インスタント実行関数(IIFE,Immedialy-Invoked Function Expression)を使用
    -このメソッドを使用して、グローバル変数を作成するのではなく、関数がすぐに実行された直後にグローバルから消去します.

    3π関数走査

  • デフォルトでは、JavaScriptは関数スキャンに従います.
  • これは、新しい関数になるたびに新しいスキャンが行われることを意味する.
  • if (true) {
      var num = '12345';
    }
    
    num; // '12345'
  • 上記のコードに示すように、関数を宣言しないと、新しいスキャンは生成されません.
  • scopeは存在しません.グローバル実行コンテキストに存在するため、numという変数
  • にはどこからでもアクセスできます.
  • 実行コンテキスト(コンテキスト):関数が属するオブジェクト
  • function newNum () {
      var num = '12345';
    }
    
    num; // error
  • 関数で定義された変数は、
  • にのみアクセスできます.

    4

  • すべてのコードブロック(関数、if文、for文、while文、try/catch文など)で宣言された変数は、そのコードブロック内でのみ有効であり、コードブロック外で参照できません.
  • コードブロック内部宣言の変数は、領域変数
  • let,const宣言された変数はブロックスキャンモードに従う.
  • 
    function myName () {
    // "if" block scope
    
        let name = "hyelin";
        console.log(name); // "hyelin"
    }
    
    // console.log(name)
    
    if (true){
    // "if" block scope
        const name = "hyelin";
        console.log(name); // "true"
    }
    
    console.log(name); // ReferenceError: message is not defined

    Lexical Scope

  • これは、関数がどこで呼び出されるかではなく、どこに宣言されるかによって異なります.
  • javascriptはLexical Scopeに従うため、関数の宣言時に親Scopeを決定します.関数をどこから呼び出すかは、スキャンを決定するのに何の意味もありません.
  • 関数が重複している場合、内部関数がオブジェクトを呼び出していない場合は、位相ミラーの下で検索します.(scopeチェーン属性)
  • const variable = 'world';
    function A(){     
      const variable = 'test';       
      B();
    }
    function B(){     
      console.log(variable);
    }
    A();
    
    //output = 'world'

    Scope Chain

  • javascriptエンジンは変数(識別子)を検索する際、まず自分の所属するscopeから検索を開始し、scopeに見つかっていない変数は上位scopeで順次検索する
    👉🏻 これはスコフ鎖と呼ばれています
  • すべてが重なる場合に発生します.
  • 📌 ただし、上位スキャンで下位スキャンに宣言された変数ではアクセスできません.
    -文を実行する場所に応じてサブスキャンポイントから開始し、必要な値が見つかるまで親スキャンポイントに沿って移動してナビゲートします.これはScope Chainの基本的な動作原理です.