Приоритет определяет, как выражение анализируется , не обязательно, как порядок его оценки . С MDN :
Операторы с более высоким приоритетом становятся операндами операторов с более низким приоритетом.
Это означает, что при синтаксическом анализе выражения вы можете Думайте об этом больше как о операторах с наименьшим приоритетом, которые «рассматриваются» вначале, а затем оценивается каждый операнд этого оператора с наименьшим приоритетом. Вы также можете считать, что операторы с самым низким приоритетом «разделяют» выражение перед операторами с более высоким приоритетом. Они определяют точку, в которой результаты одного куска не влияют на результаты другого куска.
Поэтому при синтаксическом анализе вашего выражения вы сначала учитываете оператор приоритета низший и разделяете выражение на два неявных выражения:
(++ x) + (alert(x));
Операнды всегда вычисляются слева направо, поэтому, поскольку операторы двух сторон фактически не взаимодействуют (таким образом, который может быть проанализирован), эти части вычисляются в следующем порядке:
++x //x = 1
alert(x) //alert(1)
1 + undefined // results of the above two, added together
Вызовы функций, имеющие более высокий приоритет, не означают, что они выполняются в первую очередь абсолютно, это просто означает, что они служат единичным «модулем», который не будет разделен большинством других операторов.