[JS/Node] : Scope


💡Scope


📌Scopeの例


」例1

  • コンソールの結果は?
  • let username = 'Kim Hosik';
    
    if (username) {
       let message = `Hello, ${username}!`;
      console.log(message); // 1
    }
    
    console.log(message); // 2
  • 1号:Hello, Kim Hosik!:5行目にメッセージを出力する場合、括弧の外側から4行目のユーザ名が入力されているため、正常に出力されます.
  • 2号:Uncaught ReferenceError: message is not defined at <anonymous>:8:13:8行目では、message変数自体が括弧内で宣言されているため、外部からアクセスできず、ReferenceErrorとなります.

    」例2

  • コンソールの結果は?
  • let greeting = 'Hello';
    function greetSomeone () {
      let firstName = 'Hosik';
      return greeting + ' ' + firstName;
    }
    
    console.log(greetSomeone()); // 1
    console.log(firstName); // 2
    
  • 1号:Hello Hoisk:greeting変数は外部で定義されているため、関数の内部で使用できます.
    :greeting変数とfirstName変数の組み合わせによって「Hello Hosik」文字列が返されます.
  • 2号:Uncaught ReferenceError: firstName is not defined at <anonymous>:8:13:firstName変数は関数の内部に定義されているため、関数の外部にアクセスできず、ReferenceErrorとなります.

    」例3

  • コンソールの結果は?
  • let name = '김코딩'; // 전역 변수
    
    function showName() {
      let name = '김호식'; // 지역 변수
      console.log(name); // 1
    }
    
    console.log(name); // 2
    showName();
    console.log(name); // 3

  • 1号:金浩植
    :関数で宣言されたnameという領域変数へのアクセス
    :変数名はグローバル変数と同じですが、ゾーン変数の優先度がグローバル変数より高いため、ゾーン変数名が出力されます.
    :同じ変数名のため、外部変数が内部変数によって隠される現象を変数shadowingと呼ぶ.

  • 2号:コード
    :1行目からグローバル変数として宣言されたnameを取得します.
    :ScopeルールによってshowName関数内に宣言された領域変数nameにアクセスできません.

  • 3番:コード
    :1行目からグローバル変数として宣言されたnameを取得します.
    :ScopeルールによってshowName関数内に宣言された領域変数nameにアクセスできません.

    ▼▼例4

  • コンソールの結果は?
  • let name = '김코딩'; // 전역 변수
    
    function showName() {
      name = '김호식'; // 지역 변수
      console.log(name); // 1
    }
    
    console.log(name); // 2
    showName(); 
    console.log(name); // 3

  • 1号:金浩植
    :関数で宣言されたnameという領域変数へのアクセス
    :変数名はグローバル変数と同じですが、ゾーン変数の優先度がグローバル変数より高いため、ゾーン変数名が出力されます.
    :同じ変数名のため、外部変数が内部変数によって隠される現象を変数shadowingと呼ぶ.

  • 2号:コード
    :1行目からグローバル変数として宣言されたnameを取得します.
    :ScopeルールによってshowName関数内に宣言された領域変数nameにアクセスできません.

  • 3号:金浩植
    :letキーワードを使用する宣言は存在しないため、「金虎植」値に割り当てられたname変数は、グローバル宣言を使用するname変数を表します.
    :showName関数は実行前に「kim coding」を出力し、値をグローバル変数nameに変更するため、3番目の出力「kim coding」
  • 📌Scopeとは?

  • 変数に近い範囲が存在し、この範囲をScopeと呼ぶ.
  • 重要なのは、
  • の括弧(block)の内部に変数が宣言されているかどうか、外部に変数が宣言されているかどうかです.
  • 変数のアクセス範囲も関数によって区分される.
  • 外部Scopeで宣言された変数は、内部Scopeで使用できます.
  • 内部宣言変数は外部Scopeでは使用できません.
  • 勘定科目のScope有効範囲


  • 一番外側のScopeはグローバルScopeと呼ばれています.

  • 非大域的な他のScopeをローカルScopeと呼ぶ.

  • グローバルスキャンで宣言される変数は、グローバル変数です.

  • Local Scope(領域スキャン)で宣言される変数は、領域変数です.

  • 変数アクセスルールの異なる有効範囲
  • ルール1.内側から外側へは近づくことができますが、反対にはできません.
  • ルール2.Scopeは重ねることができます.
  • ルール3.ゾーン変数は、グローバル変数よりも優先度が高い.
  • 📌Scopeのタイプ


    ✔️Block Scope


    :かっこで区切る
  • 関数キーワードを使用しても、矢印関数の場合はBlock Scopeとみなされます.
  • 」例1

  • コンソールに出力された結果は?
  • for (let i = 0; i < 5; i++) {
      console.log(i) // 다섯 번 반복한다.
    }
    
    console.log('final i:', i); // 1
  • 1号:5
    :varキーワードはBlock Scopeを無視し、Funtion Scopeのみに従うため、Blockの範囲内では使用できません.
  • Function Scope


    :関数宣言式と関数式で範囲を区切る
  • 関数キー使用可能機能Scope
  • 関数の実行から終了までが範囲です.
  • 関数には、キーワードㅄを宣言する宣言はなく、関数が実行される前に宣言されていないとみなされます.
  • 📌var, let, const


    varキーワード

  • Block Scopeは無視され、FunctionScopeのみに従います.
  • 矢印関数のBlock Scopeは無視されません.
  • ブロック単位でScopeを分割する場合、通常はインデントが行われ、視覚的により明瞭になるため、
    したがって、letキーワードを使用することをお勧めします.
  • 宣言は
  • 機能Scopeの最上位レベルで、キーワードを宣言していない宣言は最高Scopeで宣言されます.
  • を再発表しても、間違いはなく、人のミスを見つけるのは難しい.
  • letキーワード

  • Block Scopeに従います.
  • 不必要な再宣言を防ぐ.
  • constキーワード

  • の値が変化しない定数を定義します.
  • Block Scopeに従います.
  • の値の変更を最小限に抑えることで、予期せぬ変更値を防ぐことができます.したがって、値の再割り当てが必要ない場合はconstキーを使用することをお勧めします.
  • の値を再割り当てすると、タイプエラーが発生します.
  • varletconst有効範囲関数スキャンブロックスキャンと関数スキャンブロックスキャン、および関数スキャン値の再割り当ては再宣言できません