let・constとスコープの全体像

JavaScriptの変数宣言は、値がどこから見え、どこで変更できるかを決めます。letとconstの違いは単なる書き方ではありません。短いコードを実行順に追い、ブロックスコープ、再代入、一時的デッドゾーンを区別します。

この単元で学ぶこと

  • letとconstの再代入可否を区別できる
  • ブロックスコープと名前の隠蔽を追える
  • 宣言前参照とオブジェクト変更の挙動を説明できる

本文解説

変数名と値の結び付き 「let count = 1;」はcountという名前を作り、値1で初期化します。「count = 2;」は既存の名前への再代入です。宣言と再代入は別の操作で、同じスコープでlet countをもう一度宣言することはできません。let count;のように初期値を省くと、宣言が実行された後の値はundefinedです。

constは結び付きを再代入しない 「const rate = 0.1;」に続いて「rate = 0.2;」を実行するとTypeErrorになります。通常のconst宣言には初期値が必要で「const rate;」は構文エラーです。再代入しない変数にconst、再代入が必要なものにletを使うと、変更の意図が読み取りやすくなります。

ブロックスコープ 波括弧で囲んだブロック内のlet・constはそのブロックの外から参照できません。「{ let total = 3; } console.log(total);」は外側に同名の宣言がなければReferenceErrorです。varは基本的に関数スコープなので、同じブロックだけでは有効範囲が区切られません。

外側の同名変数を隠す 「let n = 1; { let n = 2; console.log(n); } console.log(n);」の表示順は2、1です。内側で新しいnを宣言したので外側のnを書き換えていません。「let」を付けず内側で「n = 2;」とだけ書けば、外側のnへ再代入し、最後も2になります。宣言の有無を見ます。

宣言前参照と一時的デッドゾーン let・constの束縛はスコープの開始から存在しますが、宣言が実行されるまでは初期化されません。この区間が一時的デッドゾーンです。「console.log(x); let x = 1;」はundefinedの表示ではなくReferenceErrorです。「let x=1; { console.log(x); let x=2; }」も内側xの未初期化を参照するためエラーです。

constのオブジェクト 「const user = {score:1}; user.score = 2;」は可能です。constが禁止するのはuserを別の値へ再代入することであり、参照先オブジェクトのプロパティ変更ではありません。「user = {score:2};」はTypeErrorになります。同様にconstで宣言した配列へpushすることも可能です。

ループのスコープ 「for (let i=0; i<3; i++) { console.log(i); }」は0、1、2を表示し、ループ外からこのiは参照できません。またletのforループでは反復ごとの束縛があり、「const f=[]; for(let i=0;i<3;i++){ f.push(()=>i); }」ならf[0]()は0、f[2]()は2です。varでは共有するiを参照するため、ループ後の呼出しは3になります。

読み解き演習 「const items=[]; { let value=2; items.push(value); } console.log(items[0]);」は2を表示します。外側itemsへの再代入はなく、配列の中身を変更しただけです。一方、最後にconsole.log(value)を追加するとブロック外なのでReferenceErrorです。エラーの種類、発生箇所、その後の処理へ進むかを順に追います。

図解

外側と内側のnは別の名前の束縛
内側のletを除くと、外側nへの再代入になり結果が変わります。

重要ポイント

  • letは再代入可、constは再代入不可。
  • 両者ともブロックスコープ。
  • 宣言前はundefinedではなく未初期化参照エラー。
  • constでも参照先オブジェクトの変更は別問題。

間違えやすい点

  • constをオブジェクト全体の凍結と解釈しない。
  • 宣言前のlet参照をvarと同じと思わない。
  • 内側の同名宣言と外側への代入を混同しない。

用語解説

束縛
変数名と値を結び付けて管理する仕組み。
スコープ
名前を参照できる範囲。
一時的デッドゾーン
let・constなどが宣言実行前で未初期化の区間。
シャドーイング
内側の同名宣言が外側の名前を隠すこと。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。