Задать вопрос
@Nikita_Migushev

Почему counter не инкрементируется?

Почему в данной конструкции counter не инкрементируется?

var button = document.getElementById("button")

var productCounter = 0

function incrementCounter(counter) {
counter++
console.log(counter)
}

button.addEventListener("click", function() {
	incrementCounter(productCounter);
})


JS FIDDLE
  • Вопрос задан
  • 158 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
john36allTa
@john36allTa
alien glow of a dirty mind
Примитивные типы данных в JS(Number, String) копируются при передаче в функцию, а вот например объекты (Object) передаются по ссылке, не смотря на то, что примитивы тоже объекты:
var productCounter = { a: 0 }

function incrementCounter(counter) {
counter.a++
console.log(counter.a)
}

incrementCounter(productCounter)
console.log(productCounter.a)

Вот статейка
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@0ffff0
Потому что фунция при вызове обращается к переменной в которой лежит ноль, и поскольку каждый новый вызов функции - это новое замыкание, значение этой переменной измененное в нем, дотупно только внутри него. Для того чтобы сделать доступным в глобальной области значение переменной доступное внутри области видимости функции достаточно просто сделать ретурн: 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);
})
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы