Skip to content

Замыкания

Как функция сохраняет доступ к переменным вокруг себя.

Функция может использовать переменные, объявленные во внешней функции. Если внутренняя функция продолжает существовать после завершения внешней, она сохраняет доступ к этим переменным. Это и есть замыкание.

main.js
function createCounter() {
  let count = 0;
 
  return function () {
    count += 1;
    return count;
  };
}
 
const countClicks = createCounter();
console.log(countClicks()); // 1
console.log(countClicks()); // 2
console.log(countClicks()); // 3

После createCounter() переменная count не исчезает: возвращённая функция всё ещё обращается к ней. Она получает доступ к той же переменной, поэтому каждое следующее значение больше предыдущего.

Каждый вызов createCounter() создаёт собственную переменную:

main.js
const firstCounter = createCounter();
const secondCounter = createCounter();
 
firstCounter();
firstCounter();
console.log(secondCounter()); // 1

secondCounter начинает с 1, потому что при его создании появилась отдельная переменная count. Такое решение удобно, когда функции нужно хранить небольшое состояние, не открывая его напрямую остальному коду.

Замыкание и this отвечают на разные вопросы: замыкание даёт функции доступ к переменным из места, где она создана; this у обычной функции зависит от способа вызова. MDN о замыканиях.