return和return()有什么区别?


97
function a() { return 1; }
function b() { return(1); }

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

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

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

那么使用return和之间有什么区别return()


21
这里的答案也将适用于void(x)typeof(x)
保罗S.

3
@PaulS。-总是感到困惑,void(0)因为它应该是undefined的简写。因此,如果是简写形式,为什么还要包含不必要的字符?;-)
RobG 2014年

1
@RobG我认为这是一个结转的Python和要包括运营商的特殊情况,实际上可能是有用void i = 1; // ReferenceErrorVSvoid (i = 1); // undefined
保罗S.

1
:你可能会被这个问题,这是适用于C#你的问题逗乐stackoverflow.com/questions/2186595/...
埃里克利珀

Answers:


177

与之间相同

var i = 1 + 1;

var i = (1 + 1);

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

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


12
一个return语句后面可以跟一个表达式。返回必须在函数中,因此函数将返回表达式的值,或者如果没有,则返回undefined
RobG 2014年

37
@ chris97ong:return不是函数。
RemcoGerlich 2014年

34
如果return使用函数,将如何从中返回值?
dan04 '04

4
这是一个很好的例子,很好的答案,但是我认为值得在“主要”答案中加上“返回”不是函数-考虑到这是导致这个问题的误解的根源。
BiscuitBaker

3
@BiscuitBaker:我补充了一点。当我记下了这短暂的答案,我也没有想到它得到50+ upvotes ...
RemcoGerlich

21

没有区别。

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

return (x == 0);

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


6
return是一个关键字,表示 return语句的开始。
RobG 2014年

1
返回语句的评估不需要“分组”。因此,无论如何都会有布尔返回值。
狼2014年

18

实际上,这里的优先级()更高,因此它首先进行评估:

首先("1")通过以下方式进行评估:

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

因此,以上声明等同于:

return "1";

直观地看到:

有威力的

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


2
如果不是这种情况,为什么还要做出一个完全未经证实的断言,即“第二个可能会慢一些,可以忽略不计”?

9

绝对没有区别。如果您将看看JS(ECMAScript)规范的return语句。它在许多其他方面告诉您:

返回[这里没有LineTerminator]表达式;

您可以提供表达return。表达helloMath.abs(x)yourCustomFunc(7),或在你的第二个情况下,这可能是1(1)1经过评估后的表达(1)(((((1))))))真正奇怪的事物相同,甚至相同(+(!(+(!1))))


1
+1供官方参考。没有逐页参考吗?-一页HTML加载时间很长。

@狼我还没有发现。这是另一页,但也只有一页。people.mozilla.org/
萨尔瓦多·达利

是的,难过。我也不会成功。将您的报价扩展到return语句的整个语法怎么样?

9

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

return[(][expression][)];

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

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


8
只有MS会考虑在return语句中将分组设为“可选” 。在任何表达式或语法的许多其他部分中,它们都是“可选”的。
RobG 2014年

@RobG:但显然,他们在return声明中被问到的可能性更大。:P MS可能已经厌倦了从JS noobs提出问题。
cHao 2014年

2
M $的解释不正确。的(),是不是return语句的一部分。
Salman

4
“对读者来说有所不同。” 好吧,是的:MSDN规范错误地暗示了这一点,return (expression并且return expression)是合法的。
Jim Balter

2
@JimBalter随着return ()return (return ):P
保罗

9

return一个语句 ,该语句以return语句开头而不是一个函数。

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

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

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

return 1;
var a = 1;

之所以return()抛出一个语法错误是的确切原因以下行引发错误(包括在比较中return语句):

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

顺便提一句,如果return后面没有任何内容,则表示您想返回undefined
IQAndreas 2014年

@Wolf表达式是可选的,因此return它本身就是一个return语句。
Paul

6

人与人之间存在巨大差异,而JavaScript引擎则为零差异。

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

return(1)是由惯用约定伪装成函数调用的同一条语句,即您没有义务在Javascript括号内插入空格。如果要在生产系统中使用这样的代码,在花了一些时间试图确定您是否确实return()在代码库中有某个功能或者只是不知道该使用什么return关键字之后,任何维护人员都会带着火把来到您的办公室。

正如许多其他人已经正确说过的那样,括号除了对数字具有更高优先级的“组”外没有任何作用1


3
“人与人之间存在巨大差异”-不称职。“伪装成函数调用的同一条语句”-没有return函数。“一种愚蠢的约定,即您没有义务在Java括号中插入空格” –几乎没有语言要求这样做;称这种白痴是白痴。“任何维护者都会带着火把和火炬来到您的办公室” –没有人能胜任。return(1)这是一种不好的做法,但是对此类事情感到不满的人正在浪费资源并营造不良气氛。
Jim Balter 2014年

@JimBalter“不称职的人”-哈!“几乎没有语言要求”-这就是为什么我说“惯例”。如果是白痴,那就叫做“白痴”。“没有return函数”-解释器将禁止您使用名称注册函数的事实return将不会帮助代码阅读者不要首先质疑他的理智,因此,此代码是浪费的。return(1)不仅是“不良实践”,而且是一个不知道自己在做什么的危险信号!
hijarian 2014年

2
因此,您要么不知道“义务”是什么意思,要么正在更改您的主张……无论哪种方式,我都不会在您身上浪费更多的时间。
Jim Balter 2014年

我怀疑你最后一句话的真相;return(在我所知道的所有语言中都有此关键字)具有最低优先级。因此,如果存在可选表达式,则始终会首先对其求值。

4

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

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

是否使用括号是样式问题,而大多数样式指南都禁止在琐碎的情况下使用括号,例如问题中引用的括号,因为它使return错误地看起来像一个函数。

后来的附录

如果带括号或不带括号,请不要忘记将可选表达式放在的后面return,即同一行。在真正的缺陷return在JavaScript在于加入后换行:

function test() {
  return 
  1;
}

...因为以上test函数将返回undefined


1

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

例如

return a + b;

转化为

return; a + b;

由ASI。

控制台将警告“ return语句后代码无法到达”。为避免此问题(防止ASI),可以使用括号:

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


这是绝对正确的,这样对于复杂的表达式才有意义。但是,您应该在第一句中添加相同的行直接在return后面,以使其更加清晰。我认为反对意见来自对这一点的误解。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.