每个Javascript函数都必须返回一个值吗?


99

我写的是,我正在使用Netbeans向每个函数添加类似专业的注释。因此,我从每一个开始/**,然后按Enter来让Netbeans完成用于以下功能的默认注释方案。

到目前为止,我只在PHP语言中使用过这种语言,在这种情况下@returns {type},如果遵循PHP函数确实包含了return声明,则Netbeans始终仅在注释方案中添加部分内容。在所谓的“过程”(不返回任何值的函数)上,缺少此部分。

今天,我为Javascript函数尝试了同样的事情,@returns {undefined}即使跟随函数不返回任何内容,Netbeans也在注释方案中添加了一部分。

这让我感到困惑。Netbeans是否以这种方式建议每个Javascript函数都必须返回任何内容?我该怎么办?忽略(或删除)该注释方案的一部分或遵循建议(如果完全是建议),并return false;在此功能的末尾添加,尽管这对我来说毫无用处?


6
如果未指定返回值,则JavaScript将返回undefined。在许多语言中,返回最后一个语句的结果(更有用的是IMO)。这些称为隐式收益
Zaz

Answers:


189

最简洁的答案是不。

真正的答案是肯定的:JS引擎必须要通知一些功能已经完成了它的业务,这是由函数返回有所作为。这也是为什么说函数“已返回”而不是“完成”的原因。 缺少显式return语句的函数将返回,例如说没有返回值的C(++)函数(其签名反映了这一点)将返回:
undefinedvoid

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

同样,在JS中,就像大多数每种语言一样,您可以随意忽略函数的返回值,这是非常困难的:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

在一些非常低的水平,在回报转换成某种跳跃。如果一个函数真的什么也没有返回,就无法知道什么以及何时调用下一个函数,或者调用事件处理程序等等。

回顾一下:不,一个JS函数不需要返回任何代码。但是就JS引擎而言:函数总是返回某些内容,无论是通过return语句来显式还是隐式地。如果函数隐式返回,则其返回值将始终是未定义的。


5
我不相信C ++(或C)会“返回空白”。“无效”标记表示它不返回任何内容。不过,这只是次要点,与提出的问题无关。
周杰伦

2
实际上并没有返回void,它什么也不返回,但是它的签名通过void返回类型反映了这一点。
Elias Van Ootegem'3

显式收益与隐性收益有什么性能上的好处?
2015年

@ 4m1r:我不知道,这可能取决于引擎。如果存在性能差异,则极有可能忽略不计。隐式return vs return;可能仅在需要提前返回时才有用。return undefined;如果undefined解析为不同的值,写作可能会产生不同的结果。当您尝试重新分配未定义的内容时,大多数(如果不是全部)浏览器都会抛出错误,但是从理论上讲,这可能是使用node.js的示例
Elias Van Ootegem 2015年

1
@SebastianLasse:我是void用其他语言(例如C)指代的,您可以在其中使用诸如之类的函数void do_someting(int *arg),但不能使用type变量void。在C语言中,void它不是真正的类型,因此这些函数不返回任何内容,它们只是跳转
Elias Van Ootegem

26

不,没有必要退货

但实际上没有退货undefined


6

每个Javascript函数都必须返回一个值吗?

不,他们没有。的确,在规范的深处,这些都略有不同:

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

...但是调用它们各自的结果是相同的:undefined。因此,务实地说:

  1. 您不必编写return,只需让代码执行“落在函数的末尾”
  2. 特别是如果您要返回undefined,您只需写return;
  3. 调用函数时,您不能(以代码形式)告诉执行是结束,结束return;还是以return undefined;; 结尾;它们看起来与您的调用代码完全相同

重新规范:具体来说,当函数的执行结束时,规范中的执行是“正常”完成。但是return;return value;都是具有相关值(undefined)的“返回”补全,该值(略有不同)。但是通过调用函数的语义消除了这种区别,该语义说:

...

  1. 如果结果。[[Type]]是return,则返回NormalCompletion(结果。[[Value]])。
  2. ReturnIfAbrupt(result)。
  3. 返回NormalCompletion(undefined)。

因此,您可以在代码中观察到没有区别。


2

不,您不必为每个函数都返回某些内容。它是可选的,取决于您如何编写代码逻辑。

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.