2016-07-28 215 views
22

我有一个双重问题,涉及到一些我认为是不正确的Javascript代码的问题。Javascript中括号内逗号的行为

以下语句是如何在Javascript中解释的?为什么?

(1,2,3,4) 

为什么会出现这两个调用之间的区别:这将导致a等于4Uncaught TypeError: a is not a function被抛出

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

,并

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

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

+1

阅读更多关于逗号运算符[here](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Comma_Operator)。 – Arnauld

+2

没有区别。在这两种情况下,我都会在FireFox中得到'4不是函数'.. –

+0

对我来说看起来像一个铬错误。 – georg

回答

14

How is the following statement interpreted in Javascript, and why?

(1,2,3,4) 

这是包裹在分组圆括号的逗号运算表达(实际上,它们的链)。逗号运算符是非常不寻常的:它会对它的两个操作数进行评估,然后将第二个值作为它的值,从而丢弃第一个值。你有一个它们的链,所以评估1的值,然后是2,然后是3,然后是4,而逗号运算符链的结果是值4;分组括号表达式的结果因此是4.

Why is there a difference between these two invocations:

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

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

which leads to a being equal to 4 and Uncaught TypeError: a is not a function being thrown, and

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

which leads to Uncaught TypeError: (((1 , 2) , 3) , 4) is not a function?

在这两种情况下,错误消息都是引用了表达式,该表达式产生了随后尝试调用的函数作为函数。

+2

这并不真正回答问题的第二部分。为什么'(1,2,3,4)()'的错误信息很奇怪?如果我做了类似'(1 + 2)()'的操作,我会收到一条消息,说“3不是函数”,而不是“(1 + 2)不是函数”。如果我做了'(1 + 2,3)()'这样的事情,我得到的信息是'(3,3)'而不是'3'或'(1 + 2,3)'。似乎逗号运算符评估被暂停,或者错误信息以奇怪的方式产生。 – user2357112

+3

第二个想法是,如果你只是比较'a()'和'(1,2,3,4)()',我想它看起来像刚刚解析并解析了它试图调用的表达式的JavaScript引擎。进一步的实验显示了很多其他奇怪的情况,至少Chrome的错误消息是坏的函数调用,所以我不知道这个答案是否值得深入挖掘。 – user2357112

+4

@ user2357112查看[ES6表达语法](http://www.ecma-international.org/ecma-262/6.0/#sec-expressions),它看起来像任何一种* ShiftExpression *都包含其评估值在错误信息中。任何类型* Expression *不是* ShiftExpression *在错误消息中都有解析的,未评估的文本。比较'(1 || 2 || 3 || 4)()'与'(1 + 2 + 3)()'或'(1 << 2)()'(第一种不是一种ShiftExpression ',后两个是)。这似乎只是Chrome的解析器或错误记者的一个怪癖。 – apsillers

6

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

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

它是,但是,不相同逗号作为函数参数隔板。它是一个操作员。

+1

这并不真正回答问题的第二部分。 – user2357112

4

The comma operator evaluates each of its operands (from left to right) and returns the value of the last operand.

因此,语句(1,2,3,4);返回4,所以var a = (1,2,3,4);意味着a等于4其中,不是一个函数,从而该错误。

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

+1

虽然你没有回答第二个问题。 – VisioN

+0

@VisioN Yup,更新。谢谢你让我诚实:) – rgthree

相关问题