为什么第二行代码产生错误而不是第三行?
{ foo: 'bar' } // => 'bar'
{ "foo": 'bar' } // => SyntaxError: Invalid label
({ "foo": 'bar' }) // => { foo: 'bar' }.
Run Code Online (Sandbox Code Playgroud)
语言规范的相关部分是http://es5.github.com/#x12.4
ExpressionStatement:[lookahead∉{
{,function}]表达式;
前瞻部分意味着只有在某个语句出现时,如果某个语句不以{or 开头,那么它只被视为表达式function.
{ foo: 'bar' }
Run Code Online (Sandbox Code Playgroud)
是包含'bar'带有label 的表达式语句的语句块foo.标签允许您来自break或continue来自命名循环,但可以附加到任何语句,而不仅仅是循环.
{ "foo": 'bar' }
Run Code Online (Sandbox Code Playgroud)
解析器开始解析它,找到一个表达式"foo"然后查找二进制运算符但:不是有效的二元运算符,因此它失败并出现语法异常.
({ "foo": 'bar' })
Run Code Online (Sandbox Code Playgroud)
这里括号输入表达式上下文,因此将{其视为启动对象构造函数而不是块的开头.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |