111

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

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

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

这让我很困惑。Netbeans 是否建议这样,每个 Javascript 函数都必须返回任何内容?我应该怎么办?忽略(或删除)该评论方案部分或遵循建议(如果这是建议的话)并添加return false;到此类功能的末尾,尽管它对我没用?

4

4 回答 4

208

最简洁的答案是不。

真正的答案是肯定的:必须通知 JS 引擎某个函数已经完成了它的业务,这是由函数返回一些东西来完成的。这也是为什么说函数“已返回”而不是“完成”的原因。 缺少显式 return 语句的函数将 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语句显式地返回,还是隐式地返回。如果函数隐式返回,则其返回值将始终未定义。

于 2013-06-27T07:33:56.767 回答
36

不,return没有必要。

如果没有return指定语句,undefined则返回。

于 2013-06-27T07:35:53.583 回答
10

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

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

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

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

  1. 你不必写 a return,你可以让代码执行“落到函数的尽头”
  2. 如果你要回来undefined,具体来说,你只是写return;
  3. 调用函数时,您无法(在代码中)判断执行是否结束、以 ; 结束return;或以return undefined;;结束。它们看起来与您的调用代码完全相同

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

...

  1. 如果结果.[[Type]] 为return,则返回 NormalCompletion( result .[[Value]])。
  2. ReturnIfAbrupt(结果)。
  3. 返回正常完成(未定义)。

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

于 2018-06-27T09:54:39.410 回答
2

不,你不必为每个函数返回一些东西。它是可选的,取决于您如何编写代码逻辑。

于 2013-06-27T07:26:25.983 回答