Что такое замыкание в JavaScript и где оно применяется?
- Как сделать приватную переменную в JavaScript без классов?
Замыкание — функция вместе с лексическим окружением, в котором она создана: она помнит переменные внешней функции даже после её завершения. Применение: приватное состояние, фабрики функций, обработчики событий, debounce, мемоизация, хуки React.
- Захватывается переменная, а не значение — читается текущее
- Замыкание держит внешние переменные в памяти — возможны утечки
- Каждый вызов внешней функции создаёт новое окружение
А ещё Классическая задача: счётчик через замыкание
Подробно
Как работает. Каждая функция при создании получает ссылку на окружение (scope), где она объявлена. При вызове переменные ищутся сначала в собственной области, затем по цепочке внешних. Пока функция-замыкание доступна, её окружение не собирается сборщиком.
Где встречается:
- модули и инкапсуляция до появления
#privateполей; - колбэки и обработчики, использующие переменные компонента;
debounce,once,memoize— хранят таймер или кэш;- React-хуки: обработчик видит значения состояния с того рендера, в котором создан («устаревшее замыкание» — частая ошибка в useEffect).
Утечки: обработчик, захвативший большой объект и не снятый (removeEventListener), держит этот объект в памяти.
Пример
function createCounter() {
let count = 0; // недоступна снаружи
return {
inc: () => ++count,
get: () => count,
};
}
const c = createCounter();
c.inc(); c.inc();
c.get(); // 2Что хотят услышать
- Определение через лексическое окружение.
- Пример с приватным состоянием.
- Практические применения и риск утечек.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Замыкание копирует значения внешних переменных в момент создания функции
- ✗Замыкания есть только у стрелочных функций, а обычные видят лишь свои локальные переменные
- ✗Замыкание — это способ закрыть доступ к DOM из сторонних скриптов
- ✓Функция вместе с лексическим окружением: помнит внешние переменные после выхода
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.