2 回答
 
                    
                    TA贡献1804条经验 获得超8个赞
我们来看看语言语法吧?第12节,声明:
Statement : Block VariableStatement EmptyStatement ExpressionStatement ...lots of other stuff...
这是一种非常奇特的方式,可以说语句可以是块,变量语句,空语句,表达式语句或许多其他东西。请注意,第一个选项是“Block”:
Block :
    { StatementList(opt) }StatementList :
    Statement
    StatementList Statement再一次,这是一种奇特的方式,说一个块是一个{,可选地后跟一堆语句,然后是一个}。
这就是你在你的例子中看到的:在JavaScript解析器认为你拥有的东西可能是一个对象文字(在某个地方被定义ExpressionStatement,第四个是'Statement'可能是)之前,它首先认为你有一个'Block ”。
编辑:如果需要,您可以在JavaScript引擎的源代码中看到它:
- 在V8,Chrome的JavaScript引擎中,我们进入了 - Parser::ParseStatement。它检查的第一件事是我们是否在a- {,如果是,则解析为block。
- 在Firefox的JavaScript引擎SpiderMonkey中,我们 - Parser::statement再次看到第一次检查是针对a- {并将其解析为块语句。
关于你的第二个问题,关于这个问题已经详细介绍了。总结一句话:Node.js将您的输入视为表达式(因此它不能是“阻止”),而Firebug / Chrome开发工具将其视为“语句”。
 
                    
                    TA贡献1827条经验 获得超9个赞
当新语句中的第一个标记为{,则将{}其解释为空块。
(实际上当然{出现在类似ifor 之类的header子句之后while,那么它{}也是一个空块,但那不是有趣的情况。)
因此,在任何其他上下文中,比如说一个函数的参数:
foo({});该{}被解释为一个空对象文字。
这种情况类似于function关键字在语句中的第一件事时被区别对待的方式。语法有歧义,解析器用固定规则解决问题。
添加回答
举报
