Подтвердить что ты не робот

Каков порядок оценки аргументов функции в Javascript?

По моим тестам он всегда слева направо

>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined

но я не могу найти соответствующий раздел, подтверждающий это в стандарте ECMAScript.

4b9b3361

Ответ 1

Все операторы JavaScript оценивают свои операнды слева направо, включая оператор вызова функции. Сначала функция для вызова оценивается по фактическим параметрам в порядке слева направо.

Раздел 11.2.3 - это соответствующий раздел спецификации.

11.2.3 Вызовы функций

...

2 Пусть func будет GetValue (ref).

3 Пусть argList является результатом вычисления аргументов, создавая внутренний список значений аргументов (см. 11.2.4).

...

и вы можете видеть, что производство ArgumentList является леворекурсивным

11.2.4 Списки аргументов

...

Произведение ArgumentList: ArgumentList , AssignmentExpression оценивается следующим образом

и ArgumentList оценивается до выражения AssignmentExpression в следующей формулировке.

В EcmaScript 3 некоторые из операторов сравнения (<, <=, >, >=) оценивались справа налево, так как a<=b был определен в терминах !(b<a), но это было широко признано как ошибка спецификации, основные интерпретаторы не реализовали ее таким образом, и она была исправлена ​​в EcmaScript 5.

Из спецификации языка:

11.8.5 Алгоритм анализа реляционных сравнений # Ⓣ

Сравнение x < y, где x и y - значения, выдает true, false или undefined (что указывает, что хотя бы один операнд NaN). В дополнение к x и y алгоритм берет в качестве параметра булевский флаг с именем LeftFirst. Флаг используется для управления порядком, в котором операции с потенциально видимыми побочными эффектами выполняются на x и y. Это необходимо, потому что ECMAScript определяет оценку выражений слева направо. Значение по умолчанию LeftFirst равно true и указывает, что параметр x соответствует выражению, которое находится слева от параметров y соответствующее выражение. Если LeftFirst является ложным, обратное - это случай, и операции должны выполняться с y до x. Такое сравнение выполняется следующим образом:

Ответ 2

Он определен здесь:

Производством ArgumentList : ArgumentList , AssignmentExpression является оценивается следующим образом:

  • Пусть precedingArgs будет результатом оценки ArgumentList.
  • Пусть ref будет результатом оценки AssignmentExpression.
  • Пусть arg be GetValue(ref).
  • Возвращает список, длина которого больше, чем длина precedingArgs и чьими элементами являются элементы precedingArgs, в порядок, а затем в конце arg, который является последним элементом нового список.

Читайте здесь: http://es5.github.com/#x11.2.4

При вызове функции аргументы передаются слева направо.

Ответ 3

Для исторического интереса см. также раздел 4.2 Порядок оценки JavaScript 1.1. Спецификация языка (Брендан Эих, C. Rand Mckinney, 11/18/96).

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