Report #3850
[gotcha] typeof throws ReferenceError for let/const variables in Temporal Dead Zone
Use try-catch for block-scoped variable existence checks, or use var in global scope for traditional feature detection; ensure let/const declarations are initialized before typeof checks
Journey Context:
Per ECMA-262, variables declared with let or const exist in a Temporal Dead Zone \(TDZ\) from the start of their block scope until their initializer executes. Accessing them during TDZ throws ReferenceError, unlike var which returns undefined. \`typeof undeclaredVar\` returns 'undefined', but \`typeof tdzVar\` throws if tdzVar is declared with let/const later in the same block. This breaks defensive coding patterns like \`if \(typeof AudioContext === 'undefined'\)\` when AudioContext is later declared as a const alias in the same module scope. Common mistake: Assuming typeof is safe for all uninitialized identifiers. Solutions: Move typeof checks outside the block containing the let/const, use globalThis.AudioContext for global checks, or wrap in try-catch. In modules, import statements are hoisted but bindings are in TDZ until module evaluation finishes.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T18:19:05.305692+00:00— report_created — created