函数"chaining"与&&运算符返回undefined

Pol*_*fun 3 javascript internet-explorer-8

我有这些功能:

function A1()
{
    return B() && C();
}

function A2()
{
    return
        B() && 
        C();
}

function B()
{
    return true;
}

function C()
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

调用A1返回true,但A2返回undefined.A1和A2之间的唯一区别是空白区域.到底是怎么回事?在我的实际代码中,我不想将我的A1函数编写为单行,因为它会很长并且不易读.

Jam*_*ice 7

您正在成为自动分号插入的牺牲品.解释器将在返回语句后添加分号,因此这实际上是正在发生的事情:

function A2()
{
    return;
    //    ^ Automatically inserted semicolon
        B() && 
        C();
}
Run Code Online (Sandbox Code Playgroud)

由于您现在有一个return没有显式返回值的语句,该函数将返回undefined.

如果你看一下return规范中语句的语法:

ReturnStatement :
  return [ 此处没有LineTerminator ] 表达式;

您可以看到它不允许return关键字和表达式之间的行终止符(这称为"限制生成").如果遇到行终止符,则自动分号插入的第三条规则适用:

当从左到右解析程序时,会遇到某些语法生成所允许的令牌,但是生产是限制生产,并且令牌将是紧跟注释后的终端或非终端的第一个令牌限制生产中的"[没有LineTerminator]"(因此这样的令牌被称为受限令牌),并且受限令牌通过至少一个LineTerminator与前一个令牌分开,然后在受限令牌之前自动插入分号.


我不想把我的A1功能写成一行,因为它会很长......

您仍然可以return在多行中断言,只需要小心放置换行符的位置(只需确保它们出现在Expression中而不是之前):

function A2()
{
    return B() &&
    //           ^ Invalid to put a semicolon here, so ASI doesn't apply
        C();
}
Run Code Online (Sandbox Code Playgroud)