我有这些功能:
function A1()
{
return B() && C();
}
function A2()
{
return
B() &&
C();
}
function B()
{
return true;
}
function C()
{
return true;
}
调用A1返回true,但A2返回undefined。 A1和A2之间的唯一区别是空白区域。到底是怎么回事?在我的实际代码中,我不想将我的A1函数编写为单行,因为它会很长并且不易读。
答案 0 :(得分:7)
你正在成为automatic semicolon insertion的受害者。解释器会在你的return语句后添加一个分号,所以这实际上是正在发生的事情:
function A2()
{
return;
// ^ Automatically inserted semicolon
B() &&
C();
}
由于您现在有一个没有显式返回值的return
语句,该函数将返回undefined
。
如果您查看规范中的return
语句的语法:
ReturnStatement
:
return
[没有 LineTerminator 此处] 表达式;
您可以看到它不允许return
关键字和表达式之间的行终止符(这称为“限制生产”)。如果遇到行终止符,则应用自动分号插入的第三条规则:
当从左到右解析程序时,会遇到某些语法生成所允许的令牌,但是生产是限制生产,令牌将是终端的第一个令牌或立即终止在限制生产中注释“[no LineTerminator here”]之后(因此这样的令牌被称为受限令牌),并且受限制的令牌通过至少一个LineTerminator与前一个令牌分开,然后自动插入分号受限制的令牌。
我不想把我的A1功能写成一行,因为它会很长......
你仍然可以在多行中断return
语句,你只需要注意换行符的位置(只需确保它们出现在 Expression 中而不是之前它):
function A2()
{
return B() &&
// ^ Invalid to put a semicolon here, so ASI doesn't apply
C();
}
答案 1 :(得分:1)
return (
B() &&
C()
);
也可以使用