【问题标题】:Curly bracket with "return" keyword [duplicate]带有“return”关键字的大括号[重复]
【发布时间】:2014-01-05 17:33:03
【问题描述】:
var calculator = function ()
{
   function abc() { return (2+3); }

   return {
        addFun: abc
   }
}();


var calcu = function () {
    function abc() { return (3+4); }

    return 
    {
        addFun: abc
    }
}();


$(document).ready(function () {
    alert(calculator.addFun());
    **alert(calcu.addFun());**
});

计算器和calcu函数有什么区别? calcu 函数执行时出错。

区别只是大括号是“calcu”中的下一行。如果我删除下一个并将大括号与“return”关键字放在一起,它就可以正常工作。

请解释为什么会这样?

【问题讨论】:

  • 是的,return 语句后的分号插入不同于其他地方...

标签: javascript


【解决方案1】:

解析如下:

return; // returns undefined
// a block:
{
    addFun: abc // syntax error!
};

因为自动插入分号。

改成:

return {
     addFun: abc
};

【讨论】:

  • 编辑过多!它将成为一个社区维基!
  • @Man 发布后 5 分钟编辑不算数:P
  • Nitpick:出现错误是因为 undefined 没有名为 addFun 的方法。没有语法错误。
  • 或者在你返回的内容周围加上括号。
  • @DoorknobofSnow:你确定吗?我得到TypeError: Cannot read property 'addFun' of undefined。
【解决方案2】:

它叫automatic semicolon insertion:

当遇到continue、break、return 或throw 标记并且在下一个标记之前遇到LineTerminator 时,会在@987654326 之后自动插入分号@、break、return 或 throw 令牌。

由于您的return 语句后面有一个换行符,因此会自动插入一个分号,将您的代码变成:

return;
{
    addFun: abc
}

【讨论】:

    【解决方案3】:

    Return 在 JavaScript 中是一个棘手的关键字。在第一个示例中,您将一个匿名对象返回给计算器函数,而在第二个示例中,您没有返回任何值。 JavaScript 会像这样解释第二个函数:

    var calcu = function() { 
        function abc() ...
    
        return; // return undefined
        {
              addFun: abc
        }
    

    请注意,分号在 return 关键字之后被解释,因此 calcu 函数不会返回任何内容。

    【讨论】:

    • 是的,在这种情况下,您返回的内容周围的括号消除了解释器猜测您的意图错误的所有机会。我经常因为在返回值周围使用括号而受到批评,但这正是需要它的地方。
    【解决方案4】:
    return 
    {
        addFun: abc
    }
    

    这是错误的,因为 JavaScript 会执行 return 并退出。 这应该是

    return {
        addFun: abc
    }
    

    【讨论】:

    • @Travesty3 抱歉复制粘贴错误 ;)
    • 没问题。但是缺乏代码样式使您的答案显得错误。所以我想确保它在你得到大量反对票之前得到修复。
    【解决方案5】:

    查看诸如jshint 之类的 linting 工具以避免此错误和许多其他错误,这是它的输出:

    发生的事情是这部分:

    return 
    {
        addFun: abc
    }
    

    被解释为两个语句,一个返回 void(函数立即返回 void)加上一个包含未分配给任何东西的 addFun 的对象表达式。

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多