Поле current в возвращённом объекте — снимок числа 0, а не связь с переменной замыкания. Сделайте его getter, чтобы каждое чтение возвращало актуальное значение.
Счётчик, реализованный через замыкание
Поле current в возвращённом объекте — снимок числа 0, а не связь с переменной замыкания. Сделайте его getter, чтобы каждое чтение возвращало актуальное значение.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В этой задаче нужно реализовать простой счётчик, используя возможности замыкания в JavaScript. Функция должна возвращать объект с текущим значением счётчика и методами для увеличения и уменьшения этого значения.
const makeCounter = () => {
let current = 0;
const inc = () => {
current++;
};
const dec = () => {
current--;
};
return {
current,
inc,
dec
};
};
const counter = makeCounter();
counter.inc();
counter.inc();
counter.dec();
// console.log(counter.current);
Ответ
Поле current в возвращённом объекте — снимок числа 0, а не связь с переменной замыкания. Сделайте его getter, чтобы каждое чтение возвращало актуальное значение.
const makeCounter = () => {
let current = 0;
return {
get current() { return current; },
inc() { current++; },
dec() { current--; }
};
};
После двух inc и одного dec counter.current равен 1. Состояние остаётся скрытым в замыкании, разные фабрики независимы. Если сразу деструктурировать const {current} = counter, локальная переменная снова сохранит только значение на момент чтения — getter не создаёт реактивную привязку.