Javascript中函数参数的求值顺序是什么?
根据我的测试,它总是从左到右Javascript中函数参数的求值顺序是什么?,javascript,Javascript,根据我的测试,它总是从左到右 >> console.log( console.log(1), console.log(2) ); 1 2 undefined undefined 但是我在ECMAScript标准中找不到相关章节来证实这一点。JavaScript中的所有运算符都从左到右计算其操作数,包括函数调用运算符。首先计算要调用的函数,然后按从左到右的顺序计算实际参数 是相关的规范部分 11.2.3函数调用 2设func为GetValue(ref) 3让argList作为参数评
>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined
但是我在ECMAScript标准中找不到相关章节来证实这一点。JavaScript中的所有运算符都从左到右计算其操作数,包括函数调用运算符。首先计算要调用的函数,然后按从左到右的顺序计算实际参数 是相关的规范部分 11.2.3函数调用 2设func为GetValue(ref) 3让argList作为参数评估的结果,生成参数值的内部列表(见11.2.4) 您可以看到ArgumentList产品是左递归的 11.2.4参数列表 生产ArgumentList:ArgumentList
,
AssignmentExpression的计算如下
和ArgumentList在AssignmentExpression之前进行计算,具体如下:
在EcmaScript 3下,一些比较运算符(=
)从右向左求值,因为a在这里定义:
生产ArgumentList:ArgumentList,AssignmentExpression
为
评价如下:
让predingArgs
作为评估参数列表的结果
让ref
作为计算AssignmentExpression
的结果
让arg
beGetValue(ref)
李>
返回一个列表,该列表的长度大于predingArgs
的长度,并且其项是predingArgs
的项
订单,在末尾后跟arg
,这是新订单的最后一项
名单
请阅读此处:
调用函数时,传入的参数从左到右求值。有关历史信息,请参见JavaScript 1.1语言规范的第4.2节(Brendan Eich,C.Rand Mckinney,1996年11月18日)
在函数或构造函数调用中,一个或多个参数表达式
可能出现在括号内,用逗号分隔。每个论点
表达式在任何参数的任何部分之前进行完全求值
对其右侧的表达式进行求值
这是否遵循、
和按(
&)
分组的顺序。。。控制台。log(1),控制台。log(2)是自变量执行的自变量和函数,可以认为<代码> f(g(0),g(1))< /代码>几乎可以保证与<代码> f.Apple(ToObj[[g(0),g(1)])< /代码>做同样的事情。考虑这两个等价物可能是一个有用的心理工具,也许对数组元素按左到右顺序定义的OP更有意义。code>()
@RightSaidFred:关联性仅决定您是否将a op b op c
消歧为((a op b)op c)
或(a op(b op c)
。这与在a op b
@RightSaidFred中是否首先计算a或b无关,您混淆了关联性和计算顺序。在分析时考虑了关联性,但在运行时计算顺序很重要。@RightSaidFred,为了弄清楚这一点,请尝试运行var x=1;(x=[])[0]=x;
x
现在是一个包含自身的数组,而不是一个包含1
的数组,因为x=[]
在最右边的x
@RightSaidFred,meh,downpoils之前被评估过。我理解这个问题。为了帮助你处理,关联性就是为什么x=y=z
与x=(y=z)
相同,但是1-1-1
是(1-1)-1
而不是1-(1-1)
。它启用诸如func(a++、++a、a*=a、a--、--a)
之类的求值语句。与C语言不同,它是根据上述规范定义的行为。但这不是一个好的实践。