Простой вопрос закрытия функции - функция счетчика для обновления счетчика - PullRequest
0 голосов
/ 21 февраля 2020

Здравствуйте, у меня есть код здесь:

/* example counter app */

const incrCounter = () => {
    let count = 0;

  return () => {
    return ++count;
  }
}

/* now use the counter */

incrCounter()();
incrCounter()();
alert(incrCounter()()); // expect 3 but gets 1

Я ожидаю получить предупреждение, которое говорит 3, но вместо этого я получаю 1.

Я получил живую демонстрацию здесь: https://jsfiddle.net/gunitinug/L9nrt085/1/

Спасибо.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

Каждый раз, когда вызывается incrCounter, вы получаете взамен функцию, которая закрывается над только что созданной переменной count. Если вы вызываете incrCounter 3 раза, вы получаете 3 отдельные count переменные в разных замыканиях.

Назовите его один раз , чтобы получить функцию, которая закрывается по одной привязке count, затем вызовите эту функцию 3 раза, чтобы эта привязка была увеличена в 3 раза:

const makeCounter = () => {
    let count = 0;

  return () => {
    return ++count;
  }
}

const counter = makeCounter();
counter();
counter();

console.log(counter());

Придание функции более точных имен также сделает вещи более понятными - как и выше, вы можете вызвать функцию-то-возвращает-функцию makeCounter, и вызовите возвращенную функцию counter.

0 голосов
/ 21 февраля 2020

Спасибо за ваш вклад, ребята.

При ближайшем рассмотрении я мог бы сделать это:

/* example counter app */

const incrCounter = (() => {
    let count = 0;

  return () => {
    return ++count;
  }
})();

/* now use the counter */

incrCounter();
incrCounter();
alert(incrCounter());
0 голосов
/ 21 февраля 2020

Переменная count должна находиться вне функции, чтобы сохранить ее значение

/* example counter app */
let count = 0;

const incrCounter = () => {
  return () => {
    return ++count;
  }
}

/* now use the counter */

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