Другой вывод счетчика JavaScript Closure (простой) - PullRequest
0 голосов
/ 04 сентября 2018

Может кто-нибудь объяснить мне этот другой вывод счетчика закрытия JS, пожалуйста.

Первый фрагмент , где вывод начинается с 0:

var counter = (function() {
    var count = 0;
    return function() {
        return count++;
    }
}());
console.log(counter()); // output: 0
console.log(counter()); // output: 1
console.log(counter()); // output: 2

Второй фрагмент , где вывод начинается с 1:

var add = (function() {
    var counter = 0;
    return function() {
        counter++;
        return counter;
    }
})();

console.log(add()); // output: 1;
console.log(add()); // output: 2;
console.log(add()); // output: 3;

Почему это так работает? Почему первый вывод начинается с 0, а второй с 1? Спасибо.

1 Ответ

0 голосов
/ 04 сентября 2018

counter++; имеет оператор ++ в позиции постфикса, который говорит ему сначала возвращать значение счетчика, а затем увеличивать после. Итак, в вашем первом примере вот что происходит: возвращается 0, а затем увеличивается до 1; затем возвращается 1, затем увеличивается до 2 и т. д.

Во втором примере counter++ по-прежнему возвращает первый и увеличивает после, но ничто не заботится о возвращаемом значении операции приращения, поскольку слева от этой строки кода нет левой части. Затем более поздняя строка вернет теперь увеличенное значение.

Также возможно использовать ++ в префиксной позиции, в этом случае он будет сначала увеличиваться, а затем возвращаться. Вы можете использовать это, чтобы изменить ваш первый пример для вывода 1, 2, 3.

const counter = (function() {
    let count = 0;
    return function() {
        return ++count; //<--- changed to prefix
    }
}());
console.log(counter()); // output: 1
console.log(counter()); // output: 2
console.log(counter()); // output: 3
...