> Почему garbage collector не очищает переменную в случае замыкания в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: ITFB

Стек: JavaScript

> Пример ответа

В JavaScript замыкание создаётся, когда функция "запоминает" свою лексическую область видимости, даже после того, как внешняя функция завершила выполнение. Garbage collector (GC) не может очистить переменную, потому что на неё всё ещё существует ссылка из внутренней функции.

Например:

JAVASCRIPT
function outer() {
let bigData = new Array(1000000).fill('data');
return function inner() {
console.log(bigData.length);
};
}
const closureFunc = outer(); // bigData не удаляется

Здесь inner содержит ссылку на bigData через замыкание. Пока closureFunc существует, GC видит, что bigData достижима через эту ссылку, и не освобождает память. Если бы замыкание не использовало переменную, современные движки (V8, SpiderMonkey) могли бы оптимизировать и удалить её, но при явном использовании - нет. Таким образом, замыкание "удерживает" переменную, предотвращая сборку мусора.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью