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

时间:2016-11-25 15:03:55

标签: javascript syntax-error

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

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

但使用return更正:

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

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

感谢您详细解释

1 个答案:

答案 0 :(得分:8)

  

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

完全。

  

...为什么?

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

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

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

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

当然,该功能无法执行任何操作,因为您未使用toString的结果......