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
...
的结果
我的问题是为什么以下内容不正确
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
...