Javascript中函数参数的评估顺序是什么?

hug*_*omg 21 javascript

根据我的测试,它总是从左到右

>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined
Run Code Online (Sandbox Code Playgroud)

但我找不到相关部分在ECMAScript标准中确认这一点.

Mik*_*uel 17

JavaScript中的所有运算符都从左到右评估它们的操作数,包括函数调用运算符.首先,按从左到右的顺序评估调用函数的实际参数.

第11.2.3节是相关的规范部分.

11.2.3函数调用

...

2让funcGetValue(ref).

3让argList成为评估Arguments的结果,生成一个参数值的内部列表(见11.2.4).

...

你可以看到ArgumentList的产生是左递归的

11.2.4参数列表

...

生成ArgumentList:ArgumentList , AssignmentExpression的计算方法如下

并且在下面的措辞中,在AssignmentExpression之前评估ArgumentList.

在EcmaScript的3一些比较操作符(<,<=,>,>=)评估从右到左,因为a<=b在来定义!(b<a),但被广泛认为是一个规范的错误,主要的解释并没有实现它的方式,它被固定在ECMAScript中5 .

从语言规范:

11.8.5抽象关系比较算法#Ⓣ

比较x < y,其中xy是值,产生true,falseundefined(表示至少有一个操作数NaN).除了xy算法有一个名为布尔标志LeftFirst作为参数.该标志被用于控制在其与潜在的可见的副作用操作所执行的顺序xy.这是必要的,因为ECMAScript指定从左到右的表达式评估.LeftFirst的默认值为true,表示该x参数对应于参数对应表达式左侧的y表达式.如果LeftFirst为false,则情况相反,必须在y之前执行操作x.这样的比较如下进行:

  • @RightSaidFred,为了清楚这一点,尝试运行`var x = 1; (x = [])[0] = x;`.`x`现在是一个包含自身的数组,而不是包含`1`的数组,因为`x = []`是在最右边的`x`之前计算的. (3认同)
  • @RightSaidFred,meh,downvotes是生活中的事实.我很欣赏这个问题.为了帮助你处理,关联性是为什么`x = y = z`与`x =(y = z)`相同但是`1 - 1 - 1`是`(1 - 1) - 1`而不是`1 - (1 - 1)`. (3认同)
  • @RightSaidFred,您将评估顺序与关联性混淆.在分析时考虑了相关性,但评估顺序在运行时很重要. (2认同)

Šim*_*das 13

它在这里定义:

生产ArgumentList : ArgumentList , AssignmentExpression评估如下:

  1. 让我们precedingArgs评估的结果ArgumentList.
  2. 让我们ref评估的结果AssignmentExpression.
  3. 我们argGetValue(ref).
  4. 返回一个List,其长度大于1的长度,precedingArgs其项目的项目precedingArgs按顺序排列,arg最后是新列表的最后一项.

请阅读: http ://es5.github.com/#x11.2.4

调用函数时,传入的参数从左到右进行计算.


Mik*_*keM 5

有关历史兴趣,另请参见4.2 评估 JavaScript 1.1语言规范的评估顺序(Brendan Eich,C.Rand Mckinney,11/18/96).

在函数或构造函数调用中,括号中可能出现一个或多个参数表达式,以逗号分隔.在评估其右侧的任何参数表达式的任何部分之前,将完全评估每个参数表达式.