Потому что фунция при вызове обращается к переменной в которой лежит ноль, и поскольку каждый новый вызов функции - это новое
замыкание, значение этой переменной измененное в нем, дотупно только внутри него. Для того чтобы сделать доступным в глобальной области значение переменной доступное внутри
области видимости функции достаточно просто сделать ретурн:
return productCounter = counter
Замыкание не только дает вам доступ к Scope внешней области из внутренней функции, но и скрывает свои внутренние переменные для внешних к ней областей. В JavaScript замыкания создаются каждый раз при созданиии функции, во время ее создания. Чтобы открыть доступ к текущему значению переменной, нужно ее вернуть, у вас это будет выглядеть примерно так:
var button = document.getElementById("button")
var productCounter = 0
function incrementCounter(counter) {
counter++
button.innerHTML = counter
return productCounter = counter
}
button.addEventListener("click", function() {
incrementCounter(productCounter);
})