javascript意外令牌.用`{}.toString()`

How*_*ard 7 javascript syntax-error

我的问题是为什么跟随不正确

function hello () {
    {}.toString();//Unexpected token .
}
Run Code Online (Sandbox Code Playgroud)

但是正确的return:

function hello () {
    return {}.toString();
}
Run Code Online (Sandbox Code Playgroud)

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

感谢您的详细解释

T.J*_*der 8

不知道解析器如何为不正确的版本工作,{}被视为BlockStatement?

究竟.

...为什么?

纯粹是因为这就是语法的设计方式.{当解析器期望一个语句(它在那里)时,在启动一个块和启动一个对象初始值设定项之间是不明确的,所以语法说它开始一个块.因此,{启动一个块,}结束它,并且.没有意义,因为解析器期望一个语句(或}函数体的关闭).

但在第二个例子中.因为在{之后return,解析器期望一个表达式(而不是语句),所以{启动一个对象初始化器.

任何将解析器置于其期望表达式的状态的东西都会使它将其{视为对象初始化器的开头.在这种情况下通常使用括号:

function hello() {
    ({}).toString();
}
Run Code Online (Sandbox Code Playgroud)

当然,该功能没有做任何事情,因为你没有使用toString... 的结果