Получить доступ

Что такое замыкание в JavaScript и где оно применяется?

JuniorОсновы JavaScript
Ещё спрашивают так:
  • Как сделать приватную переменную в JavaScript без классов?
Коротко

Замыкание — функция вместе с лексическим окружением, в котором она создана: она помнит переменные внешней функции даже после её завершения. Применение: приватное состояние, фабрики функций, обработчики событий, debounce, мемоизация, хуки React.

  • Захватывается переменная, а не значение — читается текущее
  • Замыкание держит внешние переменные в памяти — возможны утечки
  • Каждый вызов внешней функции создаёт новое окружение

А ещё Классическая задача: счётчик через замыкание

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Как работает. Каждая функция при создании получает ссылку на окружение (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

Что хотят услышать

  • Определение через лексическое окружение.
  • Пример с приватным состоянием.
  • Практические применения и риск утечек.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем