javascript 意外标记。使用 `{}.toString()`

javascript unexpected token . with `{}.toString()`

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

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

但更正 return:

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

不知道解析器如何为不正确的版本工作,{} 是否被视为 BlockStatement?如果是,那为什么?

感谢详细解释

No idea how parser works for the incorrect version, is {} treated as BlockStatement?

完全正确。

...why?

纯粹是因为语法就是这样设计的。 { 在解析器期望语句(it is there)时启动块和启动对象初始值设定项之间会产生歧义,因此语法说它启动块。因此,{ 开始一个块,} 结束它,并且 . 没有意义,因为解析器需要一个语句(或函数的结束 }正文)。

但是在第二个例子中。因为 {return 之后,解析器是 expecting an expression(不是语句),所以 { 启动对象初始化器。

任何将解析器置于期望表达式的状态的任何操作都会使其将 { 视为对象初始值设定项的开始。在这种情况下通常使用括号:

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

当然,该函数不会执行任何操作,因为您没有使用 toString...

的结果