Временная мертвая зона
Цель TDZ — помочь разработчикам выявлять ошибки в их коде, в частности, ошибку при попытке доступа к переменной до ее инициализации.
Временная мертвая зона (TDZ) — это концепция, описывающая состояние, в котором переменные считаются находящимися с начала их области до инициализации их объявления.
Движок JavaScript фактически работает в два этапа: разбор/компиляция и выполнение. На этапе синтаксического анализа механизм JavaScript распознает объявления переменных и поднимает их, но только для var
объявлений. Для объявлений let
и const
они не поднимаются в традиционном смысле. Вместо этого они помещаются в TDZ, что означает, что они недоступны до тех пор, пока выполнение не достигнет объявления.
Подъем
Подъем в JavaScript — это поведение, при котором объявления переменных и функций перемещаются в верхнюю часть своей области видимости на этапе компиляции, прежде чем код будет выполнен. Важно отметить, что поднимаются только объявления, а не инициализации.
Существует два основных типа подъема:
- Поднятие переменных. В JavaScript поднимаются
var
объявления. Это означает, что если вы объявляете переменную сvar
anywhere в функции, это как если бы вы объявили ее в начале функции. Однако поднимается только объявление, а не присваивание.
Вот пример:
console.log(myVar); //undefined var myVar = 5;
В приведенном выше примере myVar
поднимается наверх области видимости. Таким образом, код интерпретируется следующим образом:
var myVar; console.log(myVar); //undefined myVar = 5;
2. Поднятие функций. Объявления функций также поднимаются в JavaScript, что означает, что вы можете вызывать функцию до того, как она будет определена в коде. Это работает только с объявлениями функций, но не с функциональными выражениями или стрелочными функциями.
- Вот пример:
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 находится во временной мертвой зоне и к ней нельзя получить доступ до ее объявления.
В итоге:
- Переменные, объявленные с использованием
var
- Поднятый
- Начальное значение не определено
- Объем функций
2. Переменные, объявленные с использованием let
или const
- Не поднят
- Выдаст ошибку, если вы получите к нему доступ до инициализации
- Область действия блока
3. Объявления функций
- Поднятый
- Начальное значение - полная функция
- Область действия функции (Область блока в строгом режиме)