让我们看一下语言语法,对吧?第12节,声明:
Statement : Block VariableStatement EmptyStatement expressionStatement ...lots of other stuff...
这是一种非常奇特的说法,一个语句可以是一个块,一个变量语句,一个空语句,一个表达式语句或许多其他内容。请注意,第一个选项是“阻止”:
Block : { StatementList(opt) }StatementList : Statement StatementList Statement同样,这是一种怪异的说法,即一个块是a
{,可选地后面是一堆语句,然后是a }。
这就是您在示例中看到的结果:在Javascript解析器认为您所拥有的可能是对象文字(在
expressionStatement“声明”可能位于的第4项下定义)之前,它首先认为您拥有“阻止”
‘。
编辑:如果需要,您可以在Javascript引擎的源代码中看到它:
- 在Chrome的Javascript引擎V8中,我们进入
Parser::ParseStatement
。它检查的第一件事是我们是否在上{,如果存在,则将其解析为块。 - 在Firefox的Javascript引擎SpiderMonkey中,我们从
Parser::statement
转到再次看到针对a 的第一个检查,{并将其分析为阻塞语句。
关于第二个问题,这个问题。总结一下:Node.js将您的输入视为一个表达式(因此不能是“块”),而Firebug
/ Chrome开发人员工具则将其视为“语句”。



