我有一个双重问题,涉及我认为是不正确的Javascript代码。
如何在Javascript中解释以下语句,以及为什么?
(1,2,3,4)
为什么这两个调用之间存在差异:
var a = (1,2,3,4);
a();
导致a
等于4
和Uncaught TypeError: a is not a function
被抛出,
(1,2,3,4)();
导致Uncaught TypeError: (((1 , 2) , 3) , 4) is not a function
?
答案 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)
只是一组逗号运算符而不是函数,因此是第二个错误。