Javascript中括号内的逗号行为

时间:2016-07-28 16:08:32

标签: javascript

我有一个双重问题,涉及我认为是不正确的Javascript代码。

如何在Javascript中解释以下语句,以及为什么?

(1,2,3,4)

为什么这两个调用之间存在差异:

var a = (1,2,3,4);
a();

导致a等于4Uncaught TypeError: a is not a function被抛出,

(1,2,3,4)();

导致Uncaught TypeError: (((1 , 2) , 3) , 4) is not a function

3 个答案:

答案 0 :(得分:14)

  

如何在Javascript中解释以下语句,以及为什么?

(1,2,3,4)

这是一个逗号运算符表达式(实际上是它们的链)包装在分组括号中。逗号运算符很不寻常:它评估它的两个操作数,然后将第二个值作为其值,抛弃第一个值。你有一个链,所以评估值1,然后是2,然后是3,然后是4,逗号运算符链的结果是值4;因此,分组括号表达式的结果为4。

  

为什么这两个调用之间存在差异:

var a = (1,2,3,4);
a();

由于语言的语法。在第一种情况下,它显然不是函数调用,因为在第一个(调用之前没有值。像JavaScript这样的复杂语言的解析规则就是:复杂。解析器是上下文敏感的,并且知道如何区分分组括号和函数调用括号。

  

导致等于4和未捕获的TypeError:a不是被抛出的函数,并且

(1,2,3,4)();
     

导致Uncaught TypeError:(((1,2),3),4)不是函数?

在这两种情况下,错误消息都引用了表达结果的表达式,然后尝试将其作为函数调用。

答案 1 :(得分:6)

JS(以及其他语言)中有一个名为逗号运算符的运算符。它只需要两个操作数,并返回最右边的操作数。

a = 1, 2; // a now equals 2

然而,不是与函数参数分隔符相同的逗号。这是一个运营商。

答案 2 :(得分:4)

  

comma operator计算每个操作数(从左到右)并返回最后一个操作数的值。

因此,语句(1,2,3,4);返回4,因此var a = (1,2,3,4);表示a等于4,这不是函数,因此错误

同样,(1,2,3,4)只是一组逗号运算符而不是函数,因此是第二个错误。