Что такое лексическое окружение в JavaScript и как оно работает
Что проверяют
Понимаете ли вы механику области видимости, а не заученное определение замыкания. Из лексического окружения выводятся сразу замыкания, всплытие объявлений, временная мёртвая зона и поведение счётчиков в циклах, поэтому вопрос любят как опору для следующих.
Как отвечать
Лексическое окружение это внутренняя структура, которая создаётся при входе в участок кода. В ней две части: запись со всеми объявленными здесь переменными и функциями и ссылка на внешнее окружение. Слово «лексическое» означает, что цепочка строится по месту объявления в исходнике, а не по месту вызова.
Окружение появляется не только у функции. Блок с let или const получает своё, объявления через var живут на уровне функции целиком. При обращении к имени движок ищет его в текущей записи, потом поднимается по ссылке наружу вплоть до глобального окружения, а если не нашёл, это ReferenceError.
function counter() {
let n = 0;
return () => (n += 1);
}
const inc = counter();
inc(); // 1
inc(); // 2Вызов counter завершился, но возвращённая функция держит ссылку на его окружение, поэтому n жив и продолжает расти. Это и есть замыкание: функция вместе с окружением, в котором она была создана.
Полезно добавить про всплытие: объявления var и функций попадают в запись до выполнения кода, let и const тоже создаются заранее, но обращение к ним до строки объявления даёт ошибку.
Где спотыкаются
Говорят, что окружение определяется тем, откуда функцию вызвали. По вызову определяется this, а цепочка переменных фиксируется в момент определения функции и не зависит от места вызова.
Не могут объяснить классику с циклом: при var счётчик один на всю функцию, и все отложенные колбэки видят конечное значение, а let создаёт новую запись на каждой итерации. Это же объясняет, почему в новом коде var не пишут.
Не связывают тему с памятью. Замыкание удерживает замкнутые данные: подписка или интервал, захвативший крупный объект и не снятый при размонтировании компонента, даёт утечку, которую потом ищут по снимкам кучи.