PassFront
  1. PassFront
  2. База знаний
  3. Функции

Что такое замыкание?

Функции

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

Почему это работает

В JavaScript функция «запоминает», где она была объявлена, а не откуда её вызвали. Ссылка на внешнее лексическое окружение сохраняется, поэтому переменные не удаляются сборщиком мусора, пока на них ссылается внутренняя функция.

function makeCounter() {
  let count = 0;
  return function () {
    return ++count;
  };
}

const counter = makeCounter();
counter(); // 1
counter(); // 2

count живёт в замыкании и сохраняется между вызовами.

Где применяют

  • Приватные данные — эмуляция private-полей до появления #-полей в классах.
  • Фабрики функций — каррирование, конфигурируемые обработчики.
  • Мемоизация — кеш хранится в замыкании.
  • Колбэки и обработчики — сохраняют нужный контекст данных.

Частая ошибка с циклом

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i)); // 3, 3, 3
}
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i)); // 0, 1, 2
}

var один на весь цикл, а let создаёт новую переменную на каждой итерации — и замыкание захватывает свою.

Коротко для собеседования

Замыкание — функция, которая помнит переменные из места своего объявления. Позволяет хранить состояние между вызовами и делать приватные данные.

Подробнее: learn.javascript.ru — Замыкание, MDN — Closures

Другие вопросы раздела