Я смущен о порядке оценки в JavaScript. В моем первом примере я ожидал, что параметр number++
будет оцениваться до функции console.log()
, делая вывод консоли 2,3,4
.
Печать 1, 2, 3
на консоли:
var foo = [1,2,3]
for (number of foo) {
console.log(number++)
}
Печать 2, 3, 4
на консоль:
var foo = [1,2,3]
for (number of foo) {
number++
console.log(number)
}
Из моего понимания этого ответа аргументы будут оцениваться сначала слева направо перед выполнением содержательной функции. Это, похоже, не так - может кто-нибудь объяснить, почему нет?
Проблема здесь связана с оператором ++. Это говорит о значении числа, передает его функции и затем добавляет ее к числу.
Если вы измените его на ++number, вы получите ожидаемое поведение. Это говорит добавить один к значению числа, а затем передать это функции.
Это основы pre-increment
и post increment
. Помните, что у нас есть ++number
и number++
. ++number
немедленно увеличивает номер (в этой точке), а number++
увеличивает число при следующем number++
числа.
number++
возвращает старое значение, ++number
возвращает новое значение. Они оба по-прежнему увеличивают число в этой точке, а не (каким-то волшебным образом) в следующий раз, когда их встречают.
console.log(number++)
запускает console.log(number)
потому что он не может запускать ++ после того, как правильным параметром будет console.log(++number)
var foo = [1,2,3];
for (number of foo) console.log(number++);
console.log("---");
for (number of foo) console.log(number);
console.log("---");
// This is the same as your second block of code
for (number of foo) console.log(++number);
console.log("---");
// You can see that does not change the foo values
for (number of foo) console.log(number);
variable++
добавляется после того, как она была объявлена / использована,++variable
ранее. Ни то, ни другое не будет вызовом функцииnumber
, или они окажутся в глобальной области видимости. Или проверьте строгий режим, в который он будет выдавать, если вы попытаетесь получить доступ / назначить необъявленную переменную.