我的问题是为什么以下内容不正确
function hello () {
{}.toString();//Unexpected token .
}
但使用 return
正确的方式:
function hello () {
return {}.toString();
}
我不知道解析器如何处理不正确的版本,是否将{}
视为BlockStatement
?如果是,为什么呢?
感谢详细的解释。
我的问题是为什么以下内容不正确
function hello () {
{}.toString();//Unexpected token .
}
但使用 return
正确的方式:
function hello () {
return {}.toString();
}
我不知道解析器如何处理不正确的版本,是否将{}
视为BlockStatement
?如果是,为什么呢?
感谢详细的解释。
不知道解析器对于错误版本的处理方式,是否将{}视为BlockStatement?
没错。
...为什么?
纯粹是因为语法的设计。当解析器期望一条语句时(这就是它所在的情况),{
可能会产生歧义,即是一个块的开始还是对象初始化程序的开始。因此,语法规定它是块的开始。因此,{
开始一个块,}
结束它,而 .
是无意义的,因为解析器期望一条语句(或函数体的结束 }
)。
但在第二个例子中。由于 {
在 return
之后,解析器期望表达式(而不是语句),因此 {
开始了一个对象初始化程序。
任何使解析器处于期望表达式状态的内容都会使其将 {
视为对象初始化程序的开头。在这种情况下,通常使用括号:
function hello() {
({}).toString();
}
toString
的结果...
var x = {}.toString(); ({}).toString(); ({}.toString()); false || {}.toString();
所以你的猜测可能是正确的。 - Dmytro Vyprichenko