Временная мёртвая зона (temporal dead zone, TDZ) - это область в коде, где переменная существует, но еще не инициализирована и не может быть использована.
В JavaScript, когда переменная объявляется с использованием ключевого слова let или const, она подвергается “всплытию” (hoisting) - процессу перемещения объявления переменной в начало области видимости. Однако, в отличие от объявлений var, переменные, объявленные с помощью let или const, не получают значения undefined во время всплытия, а остаются неопределенными до момента их фактической инициализации.
В результате, если попытаться обратиться к переменной до ее инициализации, возникнет ошибка ReferenceError. Эта область кода, в которой переменная не может быть использована, называется временной мёртвой зоной.
Пример:
console.log(x) // ReferenceError: Cannot access 'x' before initialization
let x = 10В этом примере, мы пытаемся вывести значение переменной x до ее инициализации. Это приводит к ошибке времени выполнения, потому что переменная x находится во временной мертвой зоне до момента ее инициализации.
TDZ - это концепция, которая помогает разработчикам избежать ошибок времени выполнения, связанных с неопределенными переменными. Она также помогает понять, что переменная должна быть инициализирована до ее использования, что может улучшить качество и читаемость кода.
// Временная мертвая зона (Temporal Dead Zone) для 'b' и 'c'
console.log(a); // undefined, так как var поднимается, но инициализируется как undefined
console.log(b); // ReferenceError: Cannot access 'b' before initialization
console.log(c); // ReferenceError: Cannot access 'c' before initialization
var a = 10; // var поднимается, но инициализируется как undefined
// Конец временной мертвой зоны для 'b'
let b = 20; // let имеет блочную область видимости и не поднимается
// Конец временной мертвой зоны для 'c'
const c = 30; // const имеет блочную область видимости и не поднимаетсяРассмотрим еще один пример TDZ и объясним, почему возникает ошибка:
let b = 5
function foo(a = b, b) {
console.log(a, b) // RE b is not defined
}
foo(underfined, 2) //-
Временная мертвая зона (TDZ) для
bначинается с момента входа в функцию и заканчивается только после инициализации параметраb. -
При попытке использовать
bв значении по умолчанию дляa, переменнаяbещё не инициализирована, что приводит к ошибке.