Что такое всплытие (hoisting) в JavaScript?
Что проверяют
Понимаете ли вы, что поднимаются объявления, а не значения, и знаете ли разницу поведения var, let и функций.
Как отвечать
Перед выполнением кода движок обрабатывает объявления в текущей области видимости. Отсюда эффект всплытия: имя существует до строки, где оно написано.
Детали различаются:
- function declaration поднимается целиком, вызвать можно до объявления;
- var поднимается со значением
undefined, обращение до присваивания даётundefined, а не ошибку; - let и const тоже поднимаются, но попадают в мёртвую зону: обращение до объявления бросает
ReferenceError. Именно поэтому говорить «let не всплывает» неточно; - функциональные выражения и стрелки ведут себя как переменная, которой присвоено значение, то есть по правилам
var,letилиconst; - class ведёт себя как
let: мёртвая зона есть.
console.log(a); // undefined
var a = 1;
console.log(b); // ReferenceError
let b = 2;
sum(); // работает
function sum() {}Практический вывод простой: писать const по умолчанию, let при необходимости, var не использовать вовсе. Тогда всплытие перестаёт быть источником сюрпризов и остаётся вопросом на собеседовании.
Где спотыкаются
Говорят, что let и const не всплывают.
Считают, что поднимаются и значения, а не только объявления.
Не знают про мёртвую зону и не могут объяснить разницу между undefined и ReferenceError.
Забывают, что объявление функции в блоке ведёт себя по-разному в строгом и нестрогом режиме.