Вопрос проверяет понимание замыканий, области видимости и инкапсуляции состояния.
Счётчик через замыкание реализуется функцией, которая хранит состояние во внешней переменной и возвращает внутреннюю функцию. Эта внутренняя функция имеет доступ к переменной даже после завершения внешней функции. Таким образом состояние становится приватным и недоступным напрямую извне. Каждый вызов фабричной функции создаёт независимый счётчик.
Замыкание позволяет функции “помнить” переменные из той области видимости, где она была создана.
Замыкание (closure) — это функция вместе с лексическим окружением, в котором она была объявлена.
function createCounter() {
let count = 0;
return function () {
count += 1;
return count;
};
}
const counter = createCounter();
counter(); // 1
counter(); // 2
counter(); // 3
count — локальная переменная createCounter.
Возвращаемая функция имеет доступ к count.
count не удаляется после завершения createCounter.
const c1 = createCounter();
const c2 = createCounter();
c1(); // 1
c1(); // 2
c2(); // 1
function createCounter() {
let count = 0;
return {
inc() {
count += 1;
return count;
},
reset() {
count = 0;
},
get() {
return count;
}
};
}
Состояние инкапсулировано.
Нет глобальных переменных.
Поведение предсказуемо и тестируемо.
Счётчик через замыкание — классический пример использования лексической области видимости для хранения приватного состояния и создания независимых экземпляров логики.