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


Назад