JavaScript中出现了意外的标记,即在`{}.toString()`中出现了`.`。

7

我的问题是为什么以下内容不正确

function hello () {
    {}.toString();//Unexpected token .
}

但使用 return 正确的方式:

function hello () {
    return {}.toString();
}

我不知道解析器如何处理不正确的版本,是否将{}视为BlockStatement?如果是,为什么呢?

感谢详细的解释。


更多语法正确的例子:var x = {}.toString(); ({}).toString(); ({}.toString()); false || {}.toString(); 所以你的猜测可能是正确的。 - Dmytro Vyprichenko
1个回答

8

不知道解析器对于错误版本的处理方式,是否将{}视为BlockStatement?

没错。

...为什么?

纯粹是因为语法的设计。当解析器期望一条语句时(这就是它所在的情况),{ 可能会产生歧义,即是一个块的开始还是对象初始化程序的开始。因此,语法规定它是块的开始。因此,{ 开始一个块,} 结束它,而 . 是无意义的,因为解析器期望一条语句(或函数体的结束 })。

但在第二个例子中。由于 {return 之后,解析器期望表达式(而不是语句),因此 { 开始了一个对象初始化程序。

任何使解析器处于期望表达式状态的内容都会使其将 { 视为对象初始化程序的开头。在这种情况下,通常使用括号:

function hello() {
    ({}).toString();
}

当然,那个函数并没有实际作用,因为你没有使用toString的结果...

谢谢 @T.J.,你刚刚救了我。即使我有一些假设,它几乎让我崩溃了。非常感谢你的帮助。 - Howard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接