功能“链接”与&&运算符返回undefined

时间:2013-07-02 09:45:43

标签: javascript internet-explorer-8

我有这些功能:

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函数编写为单行,因为它会很长并且不易读。

2 个答案:

答案 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()
);

也可以使用