JavaScript Interview Prep
JS Engine & Execution

Temporal Dead Zone

The ReferenceError That Saves Your Bugs

LinkedIn Hook

The Temporal Dead Zone sounds like a Christopher Nolan movie. It's actually one of the best features let and const gave us.

It's the window of time between when a let/const variable enters scope and when its declaration line actually runs. During that window, the variable exists in memory — but touching it throws a ReferenceError.

Why would the language designers do this on purpose? Because var's "silent undefined" behavior hid bugs for YEARS. TDZ makes those bugs loud and immediate.

In this lesson you'll see why typeof — supposedly the one operator that never throws — actually DOES throw inside the TDZ, how default parameters can bite you, and the real reason TDZ was added to the spec.

If you've ever seen "Cannot access 'X' before initialization" and wondered where the error came from — read this.

Read the full lesson -> [link]

#JavaScript #InterviewPrep #TemporalDeadZone #TDZ #LetConst #JSEngine #Frontend


Temporal Dead Zone thumbnail


What You'll Learn

  • What the Temporal Dead Zone is and when it starts/ends
  • Why TDZ exists and what bug class it prevents
  • How TDZ affects default function parameters
  • Why typeof is not safe inside the TDZ

The No-Touch Window

The Temporal Dead Zone is the period between when a let/const variable enters scope and when it's actually declared in the code.

During this window, the variable exists in memory but is uninitialized. Accessing it throws a ReferenceError.

Code Example

{
  // TDZ for `name` starts here
  console.log(name); // ReferenceError: Cannot access 'name' before initialization
  
  // TDZ continues...
  
  let name = "Rakibul"; // TDZ ends here
  console.log(name);     // "Rakibul" — works fine now
}

Why Does TDZ Exist?

TDZ catches bugs early. With var, you'd get undefined silently — and spend hours debugging why your variable is undefined instead of the value you expected.

// BAD: var hides bugs
console.log(user); // undefined — no error, silent bug
var user = "Admin";

// GOOD: let catches the bug immediately
console.log(user); // ReferenceError — you know instantly
let user = "Admin";

TDZ in Function Parameters

// TDZ can bite you in default parameters too!
function greet(a = b, b = 2) {
  console.log(a, b);
}
greet(); // ReferenceError: Cannot access 'b' before initialization

// Fix: reverse the order
function greet(b = 2, a = b) {
  console.log(a, b); // 2, 2
}

TDZ with typeof

// var: typeof works even before declaration
console.log(typeof undeclaredVar); // "undefined" — no error

// let: typeof STILL throws in TDZ
console.log(typeof myLet); // ReferenceError
let myLet = 10;

This is one of the rare cases where typeof can throw an error.

Temporal Dead Zone visual 1


Common Mistakes

  • Assuming typeof variable is always safe — inside the TDZ, even typeof throws a ReferenceError.
  • Referencing a default parameter that appears later in the same parameter list — parameters are evaluated left-to-right, so the right-hand one is still in its TDZ.
  • Expecting let/const to silently be undefined before their declaration — they are hoisted but uninitialized; reading them is an error, by design.

Interview Questions

Q: What is the Temporal Dead Zone?

The period between when a let/const variable is hoisted into its scope and when its declaration line executes. Accessing the variable during this window throws ReferenceError: Cannot access 'X' before initialization.

Q: Does typeof work safely with variables in the TDZ?

No. Unlike undeclared variables where typeof returns "undefined" safely, variables in the TDZ will cause typeof to throw a ReferenceError. This is because the variable is known to exist (it's hoisted) but is explicitly uninitialized.

Q: How is TDZ different from var's hoisting behavior?

var is hoisted AND initialized to undefined, so reading it before its assignment gives undefined silently. let/const are hoisted but left uninitialized — reading them during the TDZ throws a ReferenceError, which surfaces bugs loudly instead of hiding them.

Q: Why was the TDZ added to the language?

To catch use-before-declaration bugs at runtime. var's silent undefined hid these bugs for years; TDZ makes them immediate, diagnosable errors.


Quick Reference — Cheat Sheet

TEMPORAL DEAD ZONE — QUICK MAP

  Start: when the enclosing block `{` begins
  End:   when the `let` / `const` declaration line runs

  Inside the TDZ:
    - read      -> ReferenceError
    - write     -> ReferenceError
    - typeof    -> ReferenceError (!)
    - delete    -> ReferenceError

  var has NO TDZ (hoisted as undefined).
  let / const  DO have a TDZ.

  Common trap: default parameters evaluated left-to-right
    function f(a = b, b = 2) { ... }  // b is in TDZ when a evaluates

Previous: Hoisting Next: var vs let vs const


This is Lesson 1.4 of the JavaScript Interview Prep Course — 14 chapters, 87 lessons.

On this page