函数“;链接“;与&&运算符返回undefined

Function "chaining" with && operator returns undefined

本文关键字:amp undefined 运算符 返回 链接 函数      更新时间:2023-09-26

我有以下功能:

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函数a写成一行,因为它会很长,可读性不强。

您正成为自动分号插入的牺牲品。解释器会在返回语句后添加一个分号,所以这实际上就是正在发生的事情:

function A2()
{
    return;
    //    ^ Automatically inserted semicolon
        B() && 
        C();
}

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

如果您查看规范中return语句的语法:

ReturnStatement:
 nbsp;return[此处无线路终止符]表达式;

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

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


我不想把A1函数a写成一行,因为它会很长。。。

您仍然可以在多行上打断return语句,您只需要小心换行符的位置(只需确保它们出现在表达式中,而不是之前):

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

也能正常工作