Почему вызов функции происходит после приращения переменной x в этом JavaScript коде - PullRequest
0 голосов
/ 27 февраля 2020

Почему вызов функции не выполняется первым? В соответствии с JavaScript оператор приоритета вызова функции имеет приоритет 19, но, как вы видите в приведенном ниже коде, вызов функции выполняется после приращения переменной x. Это означает, что вызов функции выводит увеличенное значение переменной x, равное 1.

 var x; // variable x;
 x = 0; // assigned the value 0 to variable x;
 ++ x + alert(x); // function call outputs the value 1;

Как вы видели в приведенном выше коде, вызов функции не выполнялся первым. Если вызов функции выполняется первым, он должен показывать окно предупреждения с номером 0, но в окне предупреждения отображается номер 1. Это означает, что после приращения переменной x выполняется только вызов функции.

Ответы [ 4 ]

3 голосов
/ 27 февраля 2020

Вы неправильно понимаете приоритет. Более высокий приоритет скобок вызова функции означает, что он будет вести себя как

++ x + (alert(x))

вместо

(++ x + alert)(x)
2 голосов
/ 27 февраля 2020

Приоритет определяет, как выражение анализируется , не обязательно, как порядок его оценки . С MDN :

Операторы с более высоким приоритетом становятся операндами операторов с более низким приоритетом.

Это означает, что при синтаксическом анализе выражения вы можете Думайте об этом больше как о операторах с наименьшим приоритетом, которые «рассматриваются» вначале, а затем оценивается каждый операнд этого оператора с наименьшим приоритетом. Вы также можете считать, что операторы с самым низким приоритетом «разделяют» выражение перед операторами с более высоким приоритетом. Они определяют точку, в которой результаты одного куска не влияют на результаты другого куска.

Поэтому при синтаксическом анализе вашего выражения вы сначала учитываете оператор приоритета низший и разделяете выражение на два неявных выражения:

(++ x) + (alert(x));

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

++x //x = 1
alert(x) //alert(1)
1 + undefined // results of the above two, added together

Вызовы функций, имеющие более высокий приоритет, не означают, что они выполняются в первую очередь абсолютно, это просто означает, что они служат единичным «модулем», который не будет разделен большинством других операторов.

1 голос
/ 27 февраля 2020

Когда вы разбиваете это на root вашего выражения, у вас есть оператор +. + работает так, что сначала его LHS оценивается как значение, затем его RHS оценивается как значение, а затем они складываются вместе.

LHS:

++ x

Таким образом, это будет оценено в первую очередь.

Затем оценивается RHS:

alert(x)

И затем они складываются вместе.

Вы можете думать о приоритете оператора как разрыв связи между двумя операторами, сражающимися за один и тот же операнд .

с MDN :

Приоритет оператора определяет, как операторы анализируются относительно каждого Другой. Операторы с более высоким приоритетом становятся операндами операторов с более низким приоритетом.

Поэтому, если у вас было это выражение:

++f(2)

Вопрос в том, интерпретируем ли мы это как:

(++f)(2)

Или как:

++(f(2))

Поскольку вызов функции имеет более высокий приоритет, чем ++, ответ - второй.

1 голос
/ 27 февраля 2020

Код интерпретируется слева направо и , затем в соответствии с приоритетом.

 >++       (Precedence 19)
 >x        (symbol)
 >+        (Precedence 14)
 >alert(x) (Precedence 20)

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

Посмотрите на этот другой пример

++get_a_number()

Здесь вызов функции имеет более высокий приоритет, чем приращение, так что будет оцениваться раньше.

...