Временная мёртвая зона (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
ещё не инициализирована, что приводит к ошибке.