Что будет при обращении к переменной var до объявления в JavaScript
Что проверяют
Знаете ли вы про поднятие объявлений и различаете ли поведение разных способов объявления.
Как отвечать
Получится undefined, а не ошибка.
console.log(x); // undefined
var x = 5;
console.log(x); // 5Причина в поднятии: объявление обрабатывается на этапе создания области видимости, до выполнения кода. Переменная существует с самого начала и инициализируется пустым значением, а присваивание остаётся на своём месте. Код ведёт себя так, как если бы объявление было перенесено наверх, а присваивание осталось внизу.
Дальше обязательно сравните с современными способами объявления. У них поднятие тоже есть, но ведут они себя иначе: переменная существует, однако до строки объявления находится во временной мёртвой зоне, и обращение к ней даёт ошибку ссылки.
console.log(y); // ReferenceError
let y = 5;Это сделано намеренно: молчаливое пустое значение маскирует ошибку, а явная ошибка её показывает.
Отличие видно и по проверке типа: для поднятой переменной старого вида она вернёт строку с пустым значением, а для переменной в мёртвой зоне бросит исключение. То есть привычная защитная проверка типа там не спасает.
Ещё два отличия старого способа, которые стоит назвать:
- область видимости функциональная, а не блочная. Объявление внутри условия или цикла видно во всей функции. Отсюда классическая задача с циклом и отложенными вызовами, где все получают последнее значение;
- повторное объявление разрешено и молча перезаписывает предыдущее.
Функции, объявленные обычным способом, поднимаются целиком вместе с телом, поэтому их можно вызывать выше по коду. Функция, присвоенная переменной, подчиняется правилам этой переменной.
Практический вывод: в новом коде старый способ не используют вовсе.
Где спотыкаются
Ждут ошибку вместо пустого значения.
Считают, что современные объявления не поднимаются.
Не знают про функциональную область видимости и попадаются на цикле с отложенными вызовами.
Полагаются на проверку типа как на защиту от мёртвой зоны.