Будут выведены 0, 1, 2, 0. Присваивание c.counter = 0 создаёт свойство функции c, но не меняет закрытую переменную counter.
Что будет напечатано в консоль при выполнении кода №102
Будут выведены 0, 1, 2, 0. Присваивание c.counter = 0 создаёт свойство функции c, но не меняет закрытую переменную counter.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно предсказать, какие значения появятся в консоли после запуска следующего JavaScript‑скрипта.
function Count() {
let counter = 0;
return () => {
console.log(counter++);
};
}
const c = new Count();
c(); //
c(); //
c.counter = 0;
c(); //
const b = new Count();
b(); //
Ответ
Будут выведены 0, 1, 2, 0. Присваивание c.counter = 0 создаёт свойство функции c, но не меняет закрытую переменную counter.
Конструктор Count явно возвращает стрелочную функцию — объект, поэтому new отдаёт именно её, а не обычный экземпляр с полями. Стрелка замыкает локальный counter соответствующего вызова Count.
Постфиксный counter++ сначала передаёт прежнее значение в console.log, затем увеличивает. У c собственное замыкание, которое продолжается с 2 несмотря на внешнее свойство. Новый вызов new Count() для b создаёт независимую локальную переменную со значением 0.