Разница в количестве ++ и счетчике + 1 в функциях высшего порядка - PullRequest
0 голосов
/ 05 сентября 2018

Пример 1

function makeCounter() {
      let count = 0;

      return function() {
        return count++;
      };
    }

    let counter = makeCounter();

    alert( counter() ); 
    alert( counter() );

Над оповещениями 0 и 1 соответственно.


Пример 2

function makeCounter() {
  let count = 0;

  return function() {
    return count+1;
  };
}

let counter = makeCounter();

alert( counter() ); 
alert( counter() ); 

Это оповещения 1 и 1 соответственно

В программировании count ++ эквивалентен count + 1, тогда почему разница в двух приведенных выше примерах. Я знаю, что это связано с закрытием собственности и подъемом. Но прекрасно понимаю. Не могли бы вы, ребята, помочь.

Примечание: пожалуйста, дайте мне знать, должен ли я изменить название вопроса, если это не имеет смысла.

Ответы [ 2 ]

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

В первом примере вы добавляете пост, то есть добавляете 1 после объявления и используете. Если бы вы использовали счетчик ++ (предварительно увеличенный), вы получите 1 и 2 в своих оповещениях.

Во втором примере вы не сохраняете значение count + 1 обратно в счетчик, поэтому во второй раз счетчик все еще равен 0, и вы снова получите тот же результат.

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

Выражение count++ оценивает count, добавляет 1, сохраняет результат в count, но общий результат (чистое значение count++) равен оригинальному значению count.

Выражение count + 1 оценивает count, добавляет 1 и возвращает результат. Значение count не изменяется.

Интересно, что можно подражать ++count (предварительное увеличение) альтернативным выражением

var inc = (count += 1);

действительно нет никакого способа (я могу придумать) подражать count++ чисто без использования функции, потому что нет необходимости обойтись во временном хранилище:

var inc = () => { let tmp = count; count += 1; return tmp }();

Семантика оператора постинкремента ++ датируется C в 1970-х и, вероятно, ранее, и была скопирована многими другими языками, включая JavaScript. Фольклор (насколько я помню, будучи пожилым человеком) считал, что операторы до и после приращения были вдохновлены режимами адресации, доступными в наборе команд DEC PDP-11, но это всегда казалось мне маловероятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...