Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中函数参数的求值顺序是什么?_Javascript - Fatal编程技术网

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
    be
    GetValue(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语言不同,它是根据上述规范定义的行为。但这不是一个好的实践。