【问题标题】:What is the difference between return and return()?return 和 return() 有什么区别?
【发布时间】:2014-05-24 04:41:12
【问题描述】:
function a() { return 1; }
function b() { return(1); }

我在 Chrome 的控制台中测试了上面的代码,都返回了1

function c() { return "1"; }
function d() { return("1"); }

我也测试了上面的代码,两个函数都返回了"1"

那么使用returnreturn() 有什么区别?

【问题讨论】:

  • 这里的答案也适用于void(x), typeof(x)
  • @PaulS.——总是对void(0) 感到困惑,因为它应该是undefined 的简写。因此,如果它是速记,为什么要包含不必要的字符? ;-)
  • @RobG 我认为它是 Python 的继承,实际上可能对您想要包含运算符 void i = 1; // ReferenceErrorvoid (i = 1); // undefined的特殊情况有用>
  • 你可能会被这个问题逗乐,这是你应用于C#的问题:stackoverflow.com/questions/2186595/…

标签: javascript


【解决方案1】:

之间相同

var i = 1 + 1;

var i = (1 + 1);

也就是说,什么都没有。括号是允许的,因为它们可以在任何表达式中影响评估顺序,但在您的示例中它们只是多余的。

return 不是函数,而是语句。它在语法上类似于breakcontinue 等其他不使用括号的简单控制流语句。

【讨论】:

  • return statement 后面可以跟一个表达式。 return 必须在函数中,因此函数返回表达式的值,如果没有,则返回 undefined
  • @chris97ong: return 不是函数。
  • 如果你把return变成了一个函数,你会如何从它返回一个值?
  • 这是一个很好的答案,有一个很好的例子,但我认为可能值得在主要答案中添加“return”不是一个函数 - 考虑到它是导致误解的根源这个问题。
  • @BiscuitBaker:我加了一点。当我记下这个简短的答案时,我确实期望它会获得 50 多票...
【解决方案2】:

没有区别。

return 不是函数调用,而是语言语句。您使用括号所做的只是将您的返回值分组,以便对其进行评估。例如,你可以写:

return (x == 0);

在这种情况下,您返回语句x == 0 的值,该语句将根据x 的值返回布尔值truefalse

【讨论】:

  • return 是一个关键字,表示return statement 的开始。
  • return 语句的评估不需要“分组”。所以无论如何都会有一个布尔返回。
【解决方案3】:

实际上() 的优先级更高,所以它首先评估:

这里首先对("1")进行评估,方式如下:

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

所以上面的语句等价于:

return "1";

目视:

所以在功能上基本上没有区别,但第二个可能会有点慢,因为它首先解决了括号。

【讨论】:

  • 如果事实并非如此,您为什么要做出完全未经证实的断言“第二个可能会慢一点可以忽略不计”?
【解决方案4】:

绝对没有区别。如果您将查看 JS (ECMAScript) specification of return 语句。在许多其他事情中,它告诉你:

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

您可以向return 提供表达式。表达式是helloMath.abs(x)yourCustomFunc(7),或者在第二种情况下,这可以是1(1)。评估后的表达式1(1) 相同,与(((((1)))))) 相同,甚至是像(+(!(+(!1)))) 这样非常奇怪的东西。

【讨论】:

  • +1 供官方参考。没有逐页参考吗? - 一页 HTML 加载时间很长。
  • @Wolf 我还没有找到这样的。这里又是一页,不过也是一页people.mozilla.org/~jorendorff/…
  • 是的,很伤心。我也没有成功。将您的报价扩展到 return 语句的整个语法怎么样?
【解决方案5】:

没有区别,括号是可选的。见MSDN

return[(][expression][)];

可选的表达式参数是要从函数返回的值。如果省略,则函数不返回值。

您使用 return 语句停止执行函数并返回表达式的值。如果省略了表达式,或者函数内没有执行返回语句,则调用当前函数的表达式被赋值为 undefined。

【讨论】:

  • 只有 MS 会认为在 return statement 中进行分组“可选”。它们就像在任何表达式或语法的许多其他部分中一样“可选”。
  • @RobG:但显然,他们更有可能在return 声明中被问及。 :P MS 可能厌倦了回答 JS 菜鸟的问题。
  • M$ 解释不正确。 () 不是 return 语句的一部分。
  • “对于读者来说是不同的。”嗯,是的:MSDN 规范错误地暗示return (expressionreturn expression) 是合法的。
  • @JimBalter 以及 return ()return (return ):P
【解决方案6】:

return语句 a keyword that starts the return statement不是函数。

如前所述,额外的括号影响评估顺序,但不用于“执行”名为return 的函数。这就是为什么这些行可以正常工作的原因:

return (1);
var a = (1);

实际上,它们与以下几行相同:

return 1;
var a = 1;

return() 引发语法错误的原因正是the following line throws an error 的原因(包含返回语句以进行比较):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error

【讨论】:

  • 顺便说一句,如果return 后面没有包含任何内容,则假定您想返回undefined
  • @Wolf 表达式是可选的,所以return 本身就是一个返回语句。
【解决方案7】:

人类差异巨大,Javascript引擎差异为零。

return 1 是一个语句,声明我们需要立即退出函数,产生值为 1。

return(1) 是与 函数调用 相同的声明,根据愚蠢的约定,您不必在 Javascript 中的括号外插入空格。如果你想在生产系统中使用这样的代码,任何维护者都会带着股份和火炬来到你的办公室,在花一些时间试图决定你是否真的在代码库中的某个地方有 return() 函数或者只是不知道什么之后 @ 987654324@关键字是for。

正如许多其他人已经正确说过的那样,括号除了“组”之外什么都不做,数字1 的文字优先级更高。

【讨论】:

  • “人类有很大的不同”——没有能力的人。 “伪装成函数调用的相同语句”——没有return 函数。 “您没有义务在 Javascript 中的括号外插入空格的愚蠢约定”——几乎没有语言要求这样做;说这个白痴是白痴。 “任何维护者都会带着木桩和火炬来到你的办公室”——没有一个称职的人会。 return(1) 是一种糟糕的做法,但对此类事情感到不安的人正在浪费资源并营造不良氛围。
  • @JimBalter “不称职的人”——哈! “几乎没有语言要求”——这就是我说“约定”的原因。如果它是白痴,它被称为“白痴”。 “没有return 函数”——解释器将禁止您注册名称为return 的函数这一事实无助于代码读者首先不要质疑他的理智,因此,这段代码是浪费。 return(1) 不仅是“糟糕的做法”,还是一个危险的信号,表明某人不知道自己在做什么!
  • 所以你要么不知道“有义务”是什么意思,要么你正在改变你的主张……不管怎样,我不会再浪费时间在你身上了。
  • 我怀疑你最后一句话的真实性; return 具有(在我知道的所有具有此关键字的语言中)最低优先级。因此,如果存在可选表达式,则始终首先对其求值。
【解决方案8】:

在return语句中,表达式周围的括号已经内置。

在 JavaScript 中,与许多其他语言(如 C、C++、Java、Python)一样,return 语句有两部分:关键字return 和(可选)表达式。因此,在任何情况下,return 关键字后面的所有内容都首先被评估为表达式,然后,通过传递控制“执行”返回语句返回给调用者。

使用或不使用括号是样式问题,而大多数样式指南都禁止它们用于像您的问题中引用的那样琐碎的情况,因为它使 return 看起来像一个函数。

稍后的附录

无论是否带括号,都不要忘记将可选表达式放在return 后面,即在同一行中。 JavaScript 中return真正的陷阱在于在其后添加换行符:

function test() {
  return 
  1;
}

...因为上面的test函数会返回undefined

【讨论】:

    【解决方案9】:

    通过添加括号,我们确保 javascript 不会在 return 之后编写的多个语句之前插入分号, 以供参考:- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Automatic_semicolon_insertion

    示例

    return a + b;

    转化为

    return; a + b;

    由 ASI 提供。

    控制台会警告“return statement after unreachable code”。 为避免此问题(以防止 ASI),您可以使用括号:

    return ( a + b );
    代码复制自:-https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

    【讨论】:

    • 这是绝对正确的,这样它对于复杂的表达式是有意义的。但是您应该在第一句中添加在同一行直接在return之后,以使其更加清晰。我认为反对票来自对此的误解。
    猜你喜欢
    • 2011-08-26
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2018-05-16
    相关资源
    最近更新 更多