変数と加速


変数を理解する前に...


コンピュータはCPUで演算し、メモリで記憶する.
メモリは、データを格納できるメモリユニットの集合である.
メモリセルのサイズは1バイト(8ビット)で、コンピュータは1バイト単位でデータを格納(書き込み)または読み出し(読み出し)します.
各セルには、メモリ領域の位置を表す独自のメモリアドレスがあり、0からメモリサイズまで整数で表示されます.
10+20が計算されると、10および20はメモリ内の任意の位置に記憶され、CPUはこれらの値を読み出して演算を実行する.演算結果から生成された結果値30もメモリ内の任意の位置に記憶される.
ただし、ここで生成した結果値30は使用できません.再利用するには、30を含む任意のメモリアドレスを見つけてメモリ領域に直接アクセスする必要がありますが、JavaScriptでは開発者が直接メモリ制御を行うことはできません.メモリアドレスに誤ってアクセスして変更すると、システムが停止する可能性があります.
また,同じCPUに同じコードを打っても値はその時点で異なる任意のアドレスに格納され,コード実行後のみ任意のアドレスが分かる.

へんすう


変数とは、格納された値のメモリ領域を識別するために命名された値の場所です.
変数=メモリ領域のアドレス

変数を使用する理由


値を再使用するには
メモリ値に格納されている任意のアドレスを直接制御すると、エラーのリスクが大きく、コードが実行されてから任意のアドレスを決定できます.

用語集


割り当て(assignment):値を変数に保存
リファレンス(reference):変数の値を読み込む
識別子(identifier):変数名.メモリ値ではなくアドレスを覚えます.
初期化(Initialization):引数宣言後、最初に値を割り当て、定義されていない値を暗黙的に割り当てることで初期化します.
宣言変数(declaration):変数を作成します.メモリ領域を解放し、変数名をメモリアドレスに関連付けます.
JAvascriptエンジンは、ソースコードを行単位で実行する前に、まずソースコードの評価を行い、ソースコードを実行する準備をします.ソースコードの評価中に、まずすべての宣言(var、let、const、function、class)を実行します.
変数エスケープ:変数宣言がコードの先頭に引かれるように.変数を宣言する前に、コードは動作します.
値の再割り当て:値が割り当てられた変数に新しい値を割り当てます.
varキーワードとして宣言された変数は、宣言と同時に最初の未定義の値を有し、厳密には、最初に変数に値を割り当てることも再割り当てされる.
定数(constant):値が決定されると変更できません.
ごみ収集器:定期的にメモリ領域をチェックして、使用されなくなったメモリを解放します.

宣言変数の3つのキーワード


1. var


  • 最初に作成した変数を宣言する方法

  • 実行時の前にjavascriptエンジンによって黙示フェーズと初期化フェーズが一度に実行されます.

  • 繰り返し宣言可能変数:同じ名前の変数があるかどうか分からない場合、最初に宣言した変数の値が変更される可能性があります.

  • varのグローバル変数(global variable)と領域変数(localvariable)の区別が曖昧で、グローバル変数のようにプログラム全体で実行できます.関数の内部にあっても、関数の外部で実行できます.
  • 2. let


  • varの欠点を補うために提案された新しい変数宣言方法

  • 重複宣言の禁止

  • 宣言フェーズと初期化フェーズは別々に行われる.

  • 実行時の前に、JavaScriptエンジンによって宣言フェーズがデフォルトで実行されますが、初期化フェーズは変数宣言に達したときに実行されます.

  • TDZ(temporal dead zone):初期化ステップの前に変数の部分を参照(読み出し)できません.
  • // 런타임 이전에 선언 단계가 실행되고, 아직은 변수가 초기화(initialize)되지 않았다.
    // 초기화 이전의 TDZ에서는 변수를 읽을 수 없다.
    console.log(fruit); // ReferenceError
    
    let fruit; // 초기화 됨. undefined 할당됨.
    console.log(fruit); // undefined
    
    fruit = 'apple'; // 값이 할당됨
    console.log(fruit) // apple

  • letには明確なグローバル変数と領域変数の区別がある.

  • letも転送になりますが、動作は転送が発生しないようです.
  • let fruit = 'apple'; // 전역 변수
    {
      console.log(fruit); // Reference error. 만약 호이스팅이 안되었다면 fruit의 값은 apple이다.
      let fruit = 'orange'; // 지역 변수
    }

    3. const


  • 再割り当て禁止:元の値が割り当てられると、変数値は変更できません.

  • ただし、constにオブジェクトを割り当てると、自由に変更できます.

  • constは宣言と同時に値を割り当てる必要があります.
  • サマリ


    つり上げる


  • コード実行時の前に、JavaScriptエンジンによって、コード実行前の宣言がプログラムの上部にドラッグされたように、すべての宣言がメモリに保存されます.

  • 反発のためvarはundefinedを返し,letとconstはReferenceErrorを表す.

  • varは実行時まで宣言ステップと初期化ステップを同時に実行して未定義の値を割り当てるため、letとconstはTDZで未定義の値の割り当てを阻止することで値を参照することはできません.
  • varとletの違い

  • 繰り返し可能かどうか:var繰り返し可能、let繰り返し不可
  • letとconstの違い

  • 再割り当て可能かどうか:letは再割り当てできますが、constはできません.ただし、constオブジェクトであれば、再割り当てだけでなく、値を変更することもできます.
  • var hoistingがundefinedを返す理由

  • javascriptは、プログラム内のすべての宣言をメモリに予め格納する実行コンテキストと呼ばれる、コード実行前に完全なコード評価プロセスを経た.値は、後でコードを実行するときに割り当てられ、返されます.したがって、評価中にvar宣言文の値は未定義として格納されます.
  • 出典:Modern JavaScript Deep Dive