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个赞
当新语句中的第一个标记为{
,则将{}
其解释为空块。
(实际上当然{
出现在类似if
or 之类的header子句之后while
,那么它{}
也是一个空块,但那不是有趣的情况。)
因此,在任何其他上下文中,比如说一个函数的参数:
foo({});
该{}
被解释为一个空对象文字。
这种情况类似于function
关键字在语句中的第一件事时被区别对待的方式。语法有歧义,解析器用固定规则解决问题。
添加回答
举报