Область видимости и поднятие
Область видимости — это набор правил, по которым движок решает, где имя доступно и на какую переменную оно указывает. В JavaScript три уровня областей — глобальная, функциональная и блочная — и они устроены по-разному для var и для let/const. Поверх этого работает лексическая модель: область имени определяется тем, где код написан, а не где вызван, — именно на этом стоят замыкания.
Второй столп темы — поднятие: движок регистрирует объявления ещё до выполнения кода, в фазе создания контекста исполнения. Отсюда растут все «странности»: var читается как undefined до своей строки, функцию можно вызвать выше её объявления, а let/const попадают во временную мёртвую зону. Каждый слой ниже разбирает один кусок этой машины.
Карта темы
- Глобальная область — область верхнего уровня и как случайно создать глобальную переменную присваиванием без ключевого слова.
- Функциональная область — почему
varвиден по всей функции независимо от вложенных блоков. - Блочная область — как
letиconstограничены ближайшими{}, аvarих игнорирует. - Лексическая область — как цепочка областей разрешает имя наружу и почему область фиксируется в месте написания.
- var, let, const — сводная таблица различий по области, поднятию, переприсваиванию и переобъявлению.
- Поднятие (hoisting) — регистрация объявлений до выполнения и разница поднятия
var, функций иlet/const. - Временная мёртвая зона (TDZ) — промежуток, где имя
let/constуже есть, но чтение бросаетReferenceError. - Затенение переменных — как внутреннее имя скрывает внешнее и что такое недопустимое затенение.
- Контекст исполнения — фазы создания и исполнения, где рождаются поднятие, TDZ, цепочка областей и
this.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Присваивание без var/let/const | Случайная глобальная переменная (или ReferenceError в строгом режиме) |
Считать var блочным | Он функциональный — протекает из if/for на всю функцию |
Читать let/const до их строки | ReferenceError из-за TDZ, а не undefined |
Считать, что до строки var — ReferenceError | Нет — var уже undefined (поднят и инициализирован) |
| Путать необъявленную и неопределённую переменную | Первая — ReferenceError, вторая — значение undefined |
var рядом с одноимённым let в той же области | SyntaxError недопустимого затенения |
Значение для собеседований
Область видимости и поднятие — любимый способ проверить, понимаете ли вы модель исполнения, а не только синтаксис. Классический вопрос — «что выведет чтение переменной до её объявления»: правильный ответ зависит от ключевого слова (undefined для var, ReferenceError для let) и требует объяснить механизм фазы создания.
Что обычно проверяют:
- Три области и какое объявление какую соблюдает.
- Что такое поднятие и чем отличается поднятие
var, функции иlet/const. - Что такое TDZ и почему
letдо строки — неundefined, а ошибка. - Лексическую модель и цепочку областей как фундамент замыканий.
Типичный неверный ответ: «поднятие физически переносит код наверх». На деле код никуда не двигается — движок лишь регистрирует объявления в фазе создания контекста, привязывая var к undefined, а let/const оставляя неинициализированными до их строки.