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

时间:2011-12-06 19:58:35

标签: javascript

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

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

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

2 个答案:

答案 0 :(得分:17)

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

Section 11.2.3是相关规范部分。

  

11.2.3函数调用

     

...

     

2让 func 成为 GetValue(ref)

     

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

     

...

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

  

11.2.4参数列表

     

...

     

生产 ArgumentList ArgumentList , AssignmentExpression 评估如下

ArgumentList 在以下措辞中 AssignmentExpression 之前进行评估..

在EcmaScript 3下,一些比较运算符(<<=>>=)从右到左进行了评估,因为a<=b是用术语定义的虽然!(b<a)已被广泛认为是一个规范错误,但主要的解释器并未以这种方式实现,并且已在EcmaScript 5中修复。

来自语言规范:

  

11.8.5 The Abstract Relational Comparison Algorithm#Ⓣ

     

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

答案 1 :(得分:13)

这里定义:

  

制作ArgumentList : ArgumentList , AssignmentExpression是   评估如下:

     
      
  1. precedingArgs成为评估ArgumentList的结果。
  2.   
  3. ref成为评估AssignmentExpression的结果。
  4.   
  5. argGetValue(ref)
  6.   
  7. 返回一个列表,其长度大于precedingArgs的长度,其项目是precedingArgs的项目,   订单,最后是arg,它是新的最后一项   列表。
  8.   

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

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