Я присвоил число 0 переменной вне функции. Я использую эту переменную, чтобы воспользоваться преимуществами замыканий, потому что я также создал простую функцию, которая возвращает переменную, увеличенную исключительно для того, чтобы отслеживать, сколько раз я вызываю функцию. Я вызываю функцию 5 раз и, наконец, передаю вызванную функцию в функцию оповещения. Что сбивает с толку, так это то, что если я увеличиваю переменную, а затем возвращаю переменную, то получаю предупреждение «6», а не «5», что означает, сколько раз я вызывал функцию, если я увеличиваю переменную и возвращаю ее в то же время, означая, что приращение переменной является частью оператора return, я получаю правильное количество раз, которое я вызвал функцию в сообщении с предупреждением. Почему я получаю разные результаты? Переменной вне функции, которую я использую в качестве счетчика, присваивается номер 0. Глобальный контекст выполнения создан и содержит эту переменную, верно? В дополнение к этому мои 5 вызовов создали 5 контекстов выполнения, и каждый раз новая инкрементная переменная живет и остается в памяти для следующего приращения вызова. Откуда берется «6»? Вот мой код, который выдает 6 как количество вызовов функции:

var i = 0; 

function add() {
   i++;
   return i;
}

add();
add();
add();
add();
add();

alert(add());

Просто сделав это:

  function add() {
   return i++;
  }

Я получил правильный номер предупрежден.

1
codebmanj 18 Дек 2015 в 09:24

4 ответа

Лучший ответ

Это связано с увеличением потока.

Предварительное увеличение (++ i) добавляет единицу к значению i, затем возвращает i, напротив, i ++ возвращает i, а затем добавляет к нему. В первом случае вы увеличиваете значение в отдельном операторе, поэтому приращение до или после не играет никакой роли, а во втором - до или после приращения, потому что функция сначала возвращает i, а затем увеличивает.

Вы получите тот же результат, если ваша функция add будет следующей

function add(){
  return ++i;
}
1
Andriy Ivaneyko 18 Дек 2015 в 06:36

Когда вы вызываете alert (add ()), вы вызываете add () еще раз и, следовательно, значение i увеличивается до 6, поскольку текущее значение i равно 5, как вы уже вызывали add 5 раз. Если вы печатаете i перед add (), вызывайте в alert все еще 5, но как только вы вызываете add () в alert, оно становится 6, потому что вы вызываете вызов метода.

    var i = 0;

    function add() {
        i++;
        return i;
    }

    add();
    add();
    add();
    add();
    add();

   // alert(i +' '+ add()); //5  6
    alert(add() +' '+ i); //6  6
0
kunsingh 18 Дек 2015 в 06:36

В первом случае значение возвращается после увеличения, во втором значение возвращается до увеличения

Попробуйте alert ( i ); вместо alert( add() ); вы получите то же значение

1
gurvinder372 18 Дек 2015 в 06:27

return i++; означает, что вы сначала возвращаете i, а затем делаете приращение.

Кстати,

return ++i; означает, что вы делаете инкремент первый, а затем возвращаете i.

0
Simon Bai 18 Дек 2015 в 06:35