为什么第二行代码会产生错误而不是第三行?
{ foo: 'bar' } // => 'bar'
{ "foo": 'bar' } // => SyntaxError: Invalid label
({ "foo": 'bar' }) // => { foo: 'bar' }.
为什么第二行代码会产生错误而不是第三行?
{ foo: 'bar' } // => 'bar'
{ "foo": 'bar' } // => SyntaxError: Invalid label
({ "foo": 'bar' }) // => { foo: 'bar' }.
语言规范的相关部分是http://es5.github.com/#x12.4
ExpressionStatement : [lookahead ∉ {
{
,function
}] 表达式;
前瞻部分意味着只有当它出现在预期语句的位置(如果它不以{
or开头)时,它才会被视为表达式function
。
{ foo: 'bar' }
'bar'
是包含带有标签的表达式语句的语句块foo
。标签允许您进出break
命名continue
循环,但可以附加到任何语句,而不仅仅是循环。
{ "foo": 'bar' }
解析器开始解析这个,找到一个表达式"foo"
,然后寻找一个二元运算符,但:
它不是一个有效的二元运算符,所以它会因为语法异常而失败。
({ "foo": 'bar' })
这里的括号进入一个表达式上下文,因此{
被视为开始一个对象构造函数而不是一个块的开始。