Вопрос проверяет понимание фаз выполнения функции и механизма hoisting.
Переменные внутри функции создаются на этапе подготовки контекста выполнения, ещё до выполнения кода функции. Движок JavaScript сначала создаёт переменные и функции, а затем выполняет код построчно. При этом var и функции инициализируются иначе, чем let и const. Последние находятся в так называемой временной мёртвой зоне до момента объявления.
Создание переменных происходит не в момент выполнения строки, а раньше — при создании контекста выполнения функции.
Когда вызывается функция, движок проходит два этапа:
Creation phase (создание контекста):
создаются переменные
создаются функции
формируется scope
Execution phase:
код выполняется построчно
Определение: Hoisting — механизм, при котором объявления переменных и функций обрабатываются до выполнения кода.
Поведение:
var
создаётся и инициализируется значением undefined
let и const
создаются, но не инициализируются
доступ запрещён до строки объявления (TDZ)
function declaration
создаётся полностью
Пример:
console.log(a); // undefined
var a = 10;
Определение: Temporal Dead Zone (TDZ) — область кода от начала блока до объявления переменной
letилиconst, где доступ к ней запрещён.
Пример:
console.log(x); // ReferenceError
let x = 5;
Объясняет порядок выполнения кода.
Помогает избегать ошибок с undefined.
Позволяет правильно проектировать область видимости.
Вывод: переменные создаются на этапе создания контекста выполнения, но инициализируются по-разному в зависимости от типа объявления.