Коротка відповідь
juniorTemporal dead zone (TDZ) — це період між оголошенням `let`/`const` і їх реальним доступом, коли змінна недоступна. У цей час спроба використати її викликає ReferenceError, що запобігає «заглушеним» значенням. TDZ забезпечує безпечну ініціалізацію змінних у блочному контексті.
Повне пояснення
Що це і навіщо
- TDZ (temporal dead zone) – період, коли змінна оголошена через
letабоconst, але ще не ініціалізована. Це запобігає використанню «заглушених» значень і підвищує безпеку коду.
Ключові принципи
- TDZ починається відразу після оголошення і триває до моменту присвоєння значення.
- Доступ до змінної в TDZ викликає
ReferenceError.
Як це працює
- При парсингу коду інтерпретатор створює «порожню» область для
let/const, але не ініціалізує її. - Після завершення блоку (наприклад, після
}) область видаляється.
Практика і реалізація
let a = 5;
console.log(a); // 5
let b;
console.log(b); // undefined (не TDZ)
let c;
console.log(c); // ReferenceError: Cannot access 'c' before initialization
Тестування
- У Jest можна перевірити TDZ:
test('TDZ throws', () => {
expect(() => { let x; console.log(x); }).toThrow(ReferenceError);
});
Особливості в контексті JS Core
- TDZ застосовується лише до
let/const;varне має TDZ. - Підтримується в усіх сучасних браузерах і Node.js.
Оптимізація та типові помилки
- Помилкове використання
varзамістьlet/constможе призвести до непередбачуваних значень. - Переконайтеся, що оголошення
let/constрозміщені перед використанням.
Часті помилки
- Виклик функції, що використовує
let, до її оголошення. - Імпорт модуля, що містить
let, у циклі без правильного порядку. - Використання
thisв arrow-функціях, деletоголошено поза контекстом. - Неправильне використання
async/awaitзletу циклі. - Змішування
varіletв одному блоці. - Неочікуване оновлення глобальної області через
letу модулях. - Підключення скриптів з різними режимами (
defer,async). - Переозначення змінної в TDZ.
Cheatsheet
let/const→ TDZ.var→ немає TDZ, підняття (hoisting).- Доступ до
let/constперед ініціалізацією → ReferenceError. - Після блоку область видаляється.