function createCounter() {
let counter =0;
counter = counter - 10
const myFunction = function () {
counter = counter+1;
return counter
}
return myFunction
}
let z = createCounter() // Вернули в переменную z функцию "myFunction" у которой в замыкании есть counter.
// counter внутри на данный момент равен -10.
// Вызвали функцию и вывели результат в консоль.
// Так как внутри функции counter берётся из замыкания, то при вызове функции получаем
// -10 + 1
console.log(z()) // -9
// В данном примере - бесполезный ничего не делающий вызов.
// То есть создаётся ещё один НОВЫЙ счётчик, со своим замыканием, но он никуда не сохраняется.
createCounter()
// Снова вызвали функцию и вывели результат в консоль.
// -9 + 1
console.log(z()) // -8
где я допускаю ошибку
Судя по всему Ваша ошибка в том, что Вы считаете, раз снова вызвали функцию createCounter - то это на что-то влияет. Но нет. Это отдельный новый вызов нового счётчика, который потом в данном примере нигде не используется.
Второй вопрос откуда берется counter при втором вызове console.log(z())
Да всё оттуда же. Из замыкания. Когда Вы в первый раз вызвали функцию createCounter и сохранили результат её работы в переменную z - Вы в переменную z поместили функцию myFunction, у которой есть своё собственное замыкание на counter.
При каждом вызове z() будет вызываться та созданная функция со своим замыканием и оперировать с counter из него.
При новом вызове createCounter возвращается НОВАЯ функция myFunction у которой своё независимое от предыдущих вызовов замыкание.
То есть createFunction это как фабрика, которая выпускает одинаковые изделия(счётчики от -10, в данном случае), но изделия не зависят друг от друга.