Вопрос с собеседования · Frontend

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

JuniorОсновы 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 минут бесплатно.

Разбор собеседования