2

为什么第二行代码会产生错误而不是第三行?

{ foo: 'bar' } // => 'bar'

{ "foo": 'bar' } // => SyntaxError: Invalid label

({ "foo": 'bar' }) // => { foo: 'bar' }.
4

1 回答 1

6

语言规范的相关部分是http://es5.github.com/#x12.4

ExpressionStatement : [lookahead ∉ { {, function}] 表达式;

前瞻部分意味着只有当它出现在预期语句的位置(如果它不以{or开头)时,它才会被视为表达式function


{ foo: 'bar' }

'bar'是包含带有标签的表达式语句的语句块foo。标签允许您进出break命名continue循环,但可以附加到任何语句,而不仅仅是循环。

{ "foo": 'bar' }

解析器开始解析这个,找到一个表达式"foo",然后寻找一个二元运算符,但:它不是一个有效的二元运算符,所以它会因为语法异常而失败。

({ "foo": 'bar' })

这里的括号进入一个表达式上下文,因此{被视为开始一个对象构造函数而不是一个块的开始。

于 2012-10-11T21:22:58.547 回答