【入門編】 letとconstの巻き上げと一時的死域(TDZ) – JavaScript実践ガイド

こんにちは。フロントエンドの現場で長年コードと向き合っていると、ふと初心者の頃に「なんでここでエラーが出るんだ!」と夜中に頭を抱えた、あの感覚を思い出します。

JavaScriptを書き始めると必ずぶつかる壁、それが「巻き上げ(Hoisting)」と「一時的死域(TDZ)」です。名前は少し強面(こわもて)ですが、実は私たちの生活の中にある「ちょっとしたルールの勘違い」と全く同じなんです。

今日は、この「なぜか動かない」の正体を、身近な例えを交えて紐解いていきましょう。

—

1. 「巻き上げ」って結局なに?

昔のJavaScriptで使われていた `var` は、プログラムが実行される前に「宣言された場所を一番上に持ち上げる」というクセがありました。これを「巻き上げ」と呼びます。

でも、`let` や `const` が登場してからは、少し状況が変わりました。これらも実は「巻き上げ」自体は起きているんです。ただ、その振る舞いが `var` とは決定的に違います。

2. 一時的死域(TDZ)を「お買い物の整理券」で例えると

皆さんが人気のお店で限定品を買おうとしていると想像してください。

1. お店(スコープ)に入る: プログラムのブロックが始まります。
2. 整理券(宣言)が配られる: `let x` と書いた時点で、JavaScriptは「ここに『x』という変数があるな」と認識します。
3. 商品を受け取る(初期化): `x = 10` と代入して初めて、変数の中身が確定します。

「一時的死域(Temporal Dead Zone:TDZ)」とは、整理券をもらった後、商品を受け取るまでの「待ち時間」のことです。

この待ち時間に「その商品、今すぐ見せて!」と店員さんに詰め寄ったらどうなりますか? 「まだ準備中なのでダメです!」と追い返されますよね。これがプログラムにおける `ReferenceError` です。

コードで見てみましょう

{
// — ここから一時的死域(TDZ)が始まる —
// コンソールで確認しようとすると…
// console.log(item); // ReferenceError: Cannot access ‘item’ before initialization

let item = “限定スニーカー”; // ここで「初期化」完了!TDZ終了!

console.log(item); // “限定スニーカー” と無事に表示される
}

`var` は「整理券をもらった瞬間に、中身が『空っぽ(undefined)』として確定」していましたが、`let` や `const` は「中身が確定するまでは一切触らせない」という厳しいルールを持っているんです。

—

3. なぜこんな面倒な仕組みがあるの?

「最初から使わせてくれればいいのに!」と思うかもしれません。でも、この厳しいルールのおかげで、私たちは多くのバグから救われています。

もし `let` が `var` のように「初期化前にundefinedとしてアクセスできてしまう」仕様だったら、プログラムのあちこちで「値が入っているはずなのにundefinedだ!」という不可解なバグが多発してしまいます。

TDZは、JavaScriptが「ちゃんとした準備が整うまで、コードを実行させないよ」と優しく(かつ厳格に)守ってくれている防波堤なんですね。

4. 実務でつまずかないためのワンポイント

現場で初心者の皆さんがよくやるミスがこれです。

// 関数の中で、宣言より先に使ってしまうケース
function getPrice() {
console.log(price); // エラー!
let price = 500;
}

解決策はとてもシンプルです。「変数は必ずスコープ(ブロック)の最初の方で宣言する」、あるいは「使う直前まで宣言を待つ」という習慣をつけるだけで、TDZの罠にはまることはなくなります。

—

最後に:怖がらなくて大丈夫です

「一時的死域」という名前のせいで難しく感じますが、要するに「準備ができていないものに手を出すな」という、プログラミングにおける当たり前のマナーをJavaScriptが強制してくれているだけなんです。

最初はエラーが出るとドキッとするかもしれませんが、「おっと、まだ準備中だったな」と優しく受け止めて、宣言の位置を見直してみてください。そうやって一つひとつ理解していくことで、あなたのコードはより堅牢で、プロフェッショナルなものに進化していきます。

何かに行き詰まったら、いつでも戻ってきてくださいね。現場のコードは、意外とこんなシンプルなルールの積み重ねでできているものです。応援しています!

コメント

タイトルとURLをコピーしました