Вопрос проверяет понимание лексического окружения и цепочки областей видимости в JavaScript, что критично для отладки замыканий и утечек памяти.
Когда функция объявляется внутри другой функции, движок JavaScript создаёт для неё лексическое окружение, которое ссылается на окружение внешней функции. Это означает, что внутренняя функция видит не только свои переменные, но и переменные всех внешних функций вплоть до глобальной области. Такой механизм называется цепочкой областей видимости (scope chain).
Важно: доступ определяется местом объявления функции, а не местом её вызова. Это и есть лексическая (статическая) область видимости.
function outer(name) {
const greeting = 'Привет';
function inner() {
// inner видит name и greeting из outer
console.log(greeting + ', ' + name);
}
return inner;
}
const sayHi = outer('Аня');
sayHi(); // Привет, Аня
После завершения outer её переменные не уничтожаются, потому что inner продолжает на них ссылаться. Это и есть замыкание: функция «запоминает» своё лексическое окружение.
Стоит помнить о подводных камнях: замыкания удерживают переменные в памяти, что может приводить к утечкам, если ссылки долго живут. Также в цикле с var все замыкания увидят одно и то же значение — решается через let или IIFE.
Итог: вложенная функция имеет доступ к своему окружению, окружению внешних функций и глобальной области, что делает замыкания мощным инструментом для инкапсуляции и сохранения состояния, но требует внимания к памяти.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию