【问题标题】:Function "chaining" with && operator returns undefined [duplicate]带有 && 运算符的函数“链接”返回未定义 [重复]
【发布时间】:2013-06-29 15:07:09
【问题描述】:

我有这些功能:

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 写成一行,因为它会很长而且可读性差。

【问题讨论】:

标签: javascript internet-explorer-8


【解决方案1】:

您正在成为automatic semicolon insertion 的受害者。解释器会在你的 return 语句之后添加一个分号,所以这实际上是正在发生的事情:

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

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

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

ReturnStatement :
return [这里没有 LineTerminator] 表达式;

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

当程序从左到右解析时,遇到某个语法产生式允许的记号,但该产生式是受限制的产生式,并且该记号将立即成为终端或非终端的第一个记号在受限产生式中的注解“[no LineTerminator here]”之后(因此这样的记号被称为受限记号),并且受限记号与前一个记号至少有一个 LineTerminator 隔开,然后在前面自动插入分号受限令牌。


我不想将我的 A1 函数 a 写成一行,因为它会很长...

您仍然可以将return 语句拆分为多行,您只需要注意将换行符放在哪里(只要确保它们出现在 Expression 中而不是之前) :

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

【讨论】:

  • 很好的答案 - 对此一无所知!
【解决方案2】:
return (
    B() && 
    C()
);

也可以

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多