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

tre*_*der 92 javascript return-value netbeans-7

我写道,我正在使用Netbeans为每个函数添加类似专业的注释.所以我开始使用它,/**然后我按下Enter让Netbeans实现以下功能的默认评论方案.

到目前为止,我一直只在PHP语言中使用它,在这种情况下@returns {type},如果遵循PHP函数真正包含return语句,Netbeans总是只添加注释方案的一部分.在所谓的"程序"(不返回任何值的函数)上,这部分缺失了.

今天我尝试了Javascript函数相同的东西,Netbeans添加@returns {undefined}了注释方案的部分,即使以下函数没有返回任何东西.

这困惑了我.Netbeans是否建议这样做,每个Javascript函数都必须返回任何内容?我该怎么办?忽略(或删除)评论方案部分或遵循建议(如果这是建议)并添加return false;到这样的功能的最后,虽然它对我没用?

Eli*_*gem 176

最简洁的答案是不.

真正的答案是肯定的:JS引擎必须要通知一些功能已经完成了它的业务,这是由函数返回有所作为.这也是为什么,而不是"完成",一个功能被称为"已经返回".
缺少显式return语句的函数将返回undefined,就像没有返回值的C(++)函数一样(并且其签名反映了这一点)返回void:

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
}
Run Code Online (Sandbox Code Playgroud)

此外,在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
Run Code Online (Sandbox Code Playgroud)

在一些非常低的水平,回报转化为某种跳跃.如果函数根本没有返回任何内容,则无法知道调用下一个函数的内容和时间,或调用事件处理程序等.

所以回顾一下:不,就你的代码而言,JS函数不需要返回任何东西.但就JS引擎而言:函数总是返回一些东西,无论是通过return语句显式还是隐式返回.如果函数隐式返回,则其返回值将始终未定义.

  • 我不相信C++(或C)"返回空白"."void"标记表示它不返回任何内容.这是一个小问题,与提出的问题无关. (5认同)
  • 它不会_actually_返回`void`,它什么也不返回,但是其签名通过`void`返回类型反映出来。 (2认同)

rha*_*dyn 23

不,没有必要返回.

但没有回报实际上归还了undefined


T.J*_*der 9

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

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

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}
Run Code Online (Sandbox Code Playgroud)

...但调用它们中的每一个的结果都是相同的:undefined. 所以从实用的角度来说:

  1. 你不必写一个return,你可以让代码执行“从函数的末尾”
  2. 如果你要回来undefined,特别是,你只是写return;
  3. 调用函数时,您无法(在代码中)判断执行是结束、结束return;还是结束return undefined;;它们看起来与您的调用代码完全相同

重新规范:具体来说,当一个函数的执行结束时,在规范中这是一个“正常”的完成;但是return;return value;都是具有关联值 ( undefined) 的“返回”完成,这是(稍微)不同的。但是调用函数的语义消除了差异,它说:

...

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

所以你可以在代码中观察到没有区别。