第15章let、constキーワードとブロックレベルスキャン


モダンJavaScript Deep Diveの本を読んで重要な内容をまとめました整理した内容に間違いがあるかもしれませんが、間違ったところがあったら、メッセージを残してください.本当にありがとうございます.
この総括文には本とは異なる変形例がある.実際の本にはより多くの例と詳細な説明があるので、お勧めします.👍

第15章let、constキーワードとブロックレベルスキャン


varキーワードとして宣言された変数の問題


変数の繰り返し宣言を許可

  • varキーワードとして宣言された変数は繰り返し宣言できます
  • var x = 1;
    var y = 1;
    
    var x = 100; // 초기화 문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작한다.
    var y; // 초기화 문이 없는 변수 선언문은 무시된다.
    
    console.log(x); // 100
    console.log(y); // 1

    かんすうレベルそうさ

  • varキーワードとして宣言された変数は、関数のコードブロックのみを領域としてスキャンする.
  • したがって、関数の外部で宣言される変数は、コードブロック内で宣言されてもグローバル変数となる.
  • 関数レベルスキャンは、グローバル変数の乱発の可能性を増加させる.予期せぬグローバル変数の繰り返し宣言が発生します.
  • へんすうかそく

  • varキーワードで変数を宣言すると、変数宣言の役割は変数エスケープによってscopeの前に引き出されたようになります.
  • 変数シースによってvarキーワードとして宣言された変数は、変数宣言の前に参照できます.
  • ただし、変数が付与文の前に参照される場合、undefinedは常に返されます.
  • console.log(foo); // undefined
    
    foo = 123;
    
    console.log(foo) // 123
    
    var foo;

    letキーワード


    繰り返し宣言変数の禁止

  • let同じ名前の変数をキーワードで繰り返し宣言すると構文エラー
  • ブロックレベルスキャン

  • letキーワードとして宣言された変数は、すべてのコードブロックを領域スキャンとして認定するブロックレベルスキャンに従う.
  • へんすうかそく

  • letキーワードとして宣言された変数の動作は、変数エスケープが発生しないようにします.
  • let変数宣言の前にキーワードとして宣言された変数を参照すると、参照エラーが発生します
  • varキーワード宣言の変数
    宣言フェーズでは、変数識別子を実行コンテキストのディレクトリ環境に登録し、JavaScriptエンジン変数の存在を通知します.そして、変数は、初期化段階で直ちにundefinedに初期化される.したがって、scopeに変数が存在するため、変数宣言文の前に変数にアクセスしてもエラーは発生しません.undefinedのみ返却します.変数付与文に到達してから、値が割り当てられます.
  • letキーワード宣言の変数
    宣言フェーズと初期化フェーズは別々に行われる.
    実行時の前にjavascriptエンジンはデフォルトで宣言ステップを実行しますが、初期化ステップは変数宣言に達すると実行されます.
    初期化ステップの実行前に変数にアクセスしようとすると、参照エラーが発生します.
    スキャンの開始点から初期化フェーズの開始点(変数宣言)まで、変数は参照できません.
    仮死角エリア仮Dead Zone
    :スキャンの開始点から初期化の開始点までの間で変数を参照できない区間
  • let foo = 1; // 전역 변수
    {
      console.log(foo); // 참조 에러: 초기화 이전에 foo에 접근할 수 없습니다.
      let foo = 2; // 지역 변수
    }
  • letキーワードとして宣言された変数が反発しない場合、上記の例はグローバル変数fooの値を出力する必要があります.
    ただし、letキーワードとして宣言された変数は、依然としてエスケープされ、参照エラーが発生します.
  • JavaScriptは、ES 6に導入されたletconstを含むすべての宣言をサポートします.
  • しかし、ES 6に導入されたletconstおよびclassの声明を用いて、その行為はエスケープが発生しないようにする.
  • グローバルオブジェクトとlet

  • varキーワードとして宣言されたグローバル変数、グローバル関数、およびデフォルトのグローバルは、グローバルオブジェクトwindowのプロトタイプになります.
  • グローバルオブジェクトのプロパティを参照する場合は、windowを省略できます.
  • // 전역 객체
    var x = 1;
    // 암묵적 전역
    y = 2;
    
    // var 키워드로 선언한 전역 변수는 전역 객체 window의 프로퍼티다.
    console.log(window.x); // 1
    // 전역 객체 window의 프로퍼티는 전역 변수처럼 사용할 수 있다.
    console.log(x); // 1
    
    // 암묵적 전연은 전역 객체 window의 프로퍼티다.
    console.log(window.y); // 2
    console.log(y); // 2
  • letキーワードとして宣言されたグローバル変数は、グローバルオブジェクトのプロパティではありません.
  • つまり、windowはアクセスできません.letグローバル変数は、非表示の概念ブロック(グローバルフォーミュラ環境の宣言環境レコード)に存在します.
  • let x = 1;
    
    // let, const 키워드로 선언한 변수는 전역 객체 window의 프로퍼티가 아니다.
    console.log(window.x); // undefined
    console.log(x); // 1
    

    constキーワード

  • constキーワードは、定数(定数)を宣言するために使用されます.ただし、必ずしも定数にのみ使用されるとは限りません.
  • 宣言と初期化

  • constキーワード宣言の変数は、宣言と同時に初期化する必要があります.
  • const foo; // Uncaught SyntaxError: Missing initializer in const declaration
    
    const foo = 1;
  • ブロックレベルスキャンがあり、変数エスケープが発生しないように動作する.
  • 再割り当ての禁止

  • constキーワードとして宣言された変数は再割り当てが禁止されます.
  • const foo = 1;
    foo = 2; // TypeError: Assignment to constant variable.

    ていすう

  • constキーワードとして宣言された変数に元の値を指定した場合、変数の値は変更できません.
  • 元の値は変更できない値なので、再割り当てなしで値を変更することはできません.
  • 変数の相対概念定数とは、再割り当てを禁止する変数を指す.定数値を格納するためにメモリ容量が必要なため、変数と呼ぶことができます.
  • 定数は、保守と可読性を容易にするために積極的に使用する必要があります.
  • constキーワードとして宣言された変数に元の値が割り当てられている場合、元の値は変更できない値であり、constキーワードは再割り当てが禁止されているため、割り当てられた値を変更することはできません.
  • また、定数はプログラム全体で共通であるため、後で変更すると定数のみが変更され、メンテナンス性が向上する.
  • 通常、定数の名前は大文字で宣言され、定数として明確に表される.複数の単語の場合は、Snake caseとして_が一般的に使用されます.
  • // 세율을 의미하는 0.1은 변경할 수 없는 상수로서 사용될 값이다.
    // 변수 이름을 대문자로 선언해 상수임을 명확히 나타낸다.
    const TAX_RATE = 0.1;
    
    // 세전 가격
    let preTaxPrice = 100;
    
    // 세후 가격
    let afterTaxPrice = preTaxPrice + (preTaxPrice * TAX_RATE);
    
    console.log(afterTaxPrice) //110

    constキーワードとオブジェクト

  • constキーワードとして宣言された変数にオブジェクトを割り当てると、その値を変更できます.
  • constキーワードは再割り当てのみ禁止されており、「不変」ではありません.
  • Propertyオブジェクトを変更するには、Property値を動的に作成、削除、および変更します.
  • オブジェクトが変更された場合、変数に割り当てられた参照値は変更されません.
  • var VS let VS const

  • 変数宣言デフォルトはconstを使用し、letは再割り当てが必要な場合にのみ使用されます.
  • ES 6無効varキーワード
  • キーワードは、再割り当てが必要な場合にのみ使用されます.この場合、変数のスキャンはできるだけ縮小されます.
  • |変更なしで読み取り専用(再割り当てを必要としない定数)の元の値とオブジェクトにはletキーワード
  • 変数を宣言する場合は、まずconstキーワードを使用します.後でconstキーワードを変更しても遅くはありません.