我正在阅读question(关于“wat”视频)的答案,并说:
{}+[]
我目前正在学习“权威指南”中的JS,所以我试着真正理解这样的事情。
我的问题是,JS何时决定将{}
解释为空代码块,而不是空对象?
此外,我想了解Node.js和Firebug之间的一些不一致。
萤火虫:
Node.js的:
答案 0 :(得分:21)
让我们看一下语言语法,好吗? Section 12, Statements:
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
...lots of other stuff...
这是一种非常奇特的方式,可以说语句可以是块,变量语句,空语句,表达式语句或许多其他内容。请注意,第一个选项是' Block':
Block :
{ StatementList(opt) }
StatementList :
Statement
StatementList Statement
这又是一种奇特的方式,表示一个块是{
,可选地后跟一堆语句,然后是}
。
这就是你在你的例子中看到的内容:在JavaScript解析器认为你拥有的内容可能是一个对象文字(在ExpressionStatement
下的某个地方定义)之前,第四个问题是'声明'可能是),它首先认为你有一个' Block'。
编辑:如果需要,您可以在JavaScript引擎的源代码中看到它:
Parser::ParseStatement
。 first thing it checks是我们是否在{
上,如果是,则解析为阻止。Parser::statement
开始再次看到the first check反对{
并将其解析为块语句。关于你的第二个问题,我们已经详细介绍了on this question。总结一句话:Node.js将您的输入视为表达式(因此它不能成为' Block'),而Firebug / Chrome开发工具将其视为&# 39;声明'
答案 1 :(得分:2)
当新语句中的第一个标记为{
时,{}
将被解释为空块。
(当然,当{
出现在if
或while
之类的标题子句之后,那么{}
也是一个空块,但是&#39}不是有趣的案例。)
因此在任何其他情境中,比如说一个函数的参数:
foo({});
{}
被解释为空对象文字。
这种情况类似于function
关键字在语句中的第一件事被区别对待的方式。语法有歧义,解析器用固定规则解决问题。