Временная мертвая зона

Цель TDZ — помочь разработчикам выявлять ошибки в их коде, в частности, ошибку при попытке доступа к переменной до ее инициализации.

Временная мертвая зона (TDZ) — это концепция, описывающая состояние, в котором переменные считаются находящимися с начала их области до инициализации их объявления.

Движок JavaScript фактически работает в два этапа: разбор/компиляция и выполнение. На этапе синтаксического анализа механизм JavaScript распознает объявления переменных и поднимает их, но только для var объявлений. Для объявлений let и const они не поднимаются в традиционном смысле. Вместо этого они помещаются в TDZ, что означает, что они недоступны до тех пор, пока выполнение не достигнет объявления.

Подъем

Подъем в JavaScript — это поведение, при котором объявления переменных и функций перемещаются в верхнюю часть своей области видимости на этапе компиляции, прежде чем код будет выполнен. Важно отметить, что поднимаются только объявления, а не инициализации.

Существует два основных типа подъема:

  1. Поднятие переменных. В JavaScript поднимаются var объявления. Это означает, что если вы объявляете переменную с varanywhere в функции, это как если бы вы объявили ее в начале функции. Однако поднимается только объявление, а не присваивание.

Вот пример:

console.log(myVar); //undefined

var myVar = 5;

В приведенном выше примере myVar поднимается наверх области видимости. Таким образом, код интерпретируется следующим образом:

var myVar;

console.log(myVar); //undefined

myVar = 5;

2. Поднятие функций. Объявления функций также поднимаются в JavaScript, что означает, что вы можете вызывать функцию до того, как она будет определена в коде. Это работает только с объявлениями функций, но не с функциональными выражениями или стрелочными функциями.

  1. Вот пример:
console.log(myFunc()); // "Hello, World!"

function myFunc() {
  return "Hello, World!";
}

В этом случае вся функция myFunc() поднимается наверх области видимости, поэтому она доступна до ее объявления в коде.

Пусть и Const

Напротив, объявления let и const не поднимаются таким же образом, как var. Хотя движок JavaScript распознает объявления let и const на этапе компиляции (помещая их в так называемую временную мертвую зону), попытка доступа к ним до их объявления приведет к ошибке ReferenceError.

Вот пример:

console.log(myLetVar); // ReferenceError: myLetVar is not defined

let myLetVar = 5; 

В этом случае попытка доступа к myLetVar до ее объявления приводит к ошибке ReferenceError, поскольку myLetVar находится во временной мертвой зоне и к ней нельзя получить доступ до ее объявления.

В итоге:

  1. Переменные, объявленные с использованием var
  • Поднятый
  • Начальное значение не определено
  • Объем функций

2. Переменные, объявленные с использованием let или const

  • Не поднят
  • Выдаст ошибку, если вы получите к нему доступ до инициализации
  • Область действия блока

3. Объявления функций

  • Поднятый
  • Начальное значение - полная функция
  • Область действия функции (Область блока в строгом режиме)