Я присвоил число 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++;
}
Я получил правильный номер предупрежден.
4 ответа
Это связано с увеличением потока.
Предварительное увеличение (++ i) добавляет единицу к значению i
, затем возвращает i
, напротив, i ++ возвращает i, а затем добавляет к нему. В первом случае вы увеличиваете значение в отдельном операторе, поэтому приращение до или после не играет никакой роли, а во втором - до или после приращения, потому что функция сначала возвращает i
, а затем увеличивает.
Вы получите тот же результат, если ваша функция add будет следующей
function add(){
return ++i;
}
Когда вы вызываете 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
В первом случае значение возвращается после увеличения, во втором значение возвращается до увеличения
Попробуйте alert ( i );
вместо alert( add() );
вы получите то же значение
return i++;
означает, что вы сначала возвращаете i, а затем делаете приращение.
Кстати,
return ++i;
означает, что вы делаете инкремент первый, а затем возвращаете i.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.