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

IT技术 javascript return-value netbeans-7
2021-01-29 02:08:07

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

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

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

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

4个回答

最简洁的答案是不。

真正的答案是肯定的: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语句显式还是隐式。如果函数隐式返回,则其返回值将始终是未定义的。

@SebastianLasse:我指的是void在其他语言(如 C)中,您可以拥有像 那样的函数void do_someting(int *arg),但不能拥有类型为 的变量void在 C 中,void并不是真正的类型,因此这些函数不返回任何内容,它们只是跳转
2021-03-17 02:08:07
我不相信 C++(或 C)“返回空值”。“void”标签表示它不返回任何东西。不过,这是一个小问题,与提出的问题无关。
2021-03-24 02:08:07
@4m1r:我不知道,这可能取决于引擎。如果存在性能差异,则很可能可以忽略不计。隐式返回 vsreturn;可能仅在您需要提前返回时才有用。return undefined;如果undefined解析为不同的值,写入可能会产生不同的结果当您尝试重新分配 undefined 时,大多数(如果不是全部)浏览器都会抛出错误,但理论上,这里有一个使用 node.js 的示例
2021-03-29 02:08:07
实际上并不return void,它什么都不返回,但它的签名通过void返回类型反映了这一点
2021-04-01 02:08:07
显式返回与隐式返回是否有任何性能优势?
2021-04-07 02:08:07

不,return没有必要。

return指定语句时,undefined返回。

每个 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. 如果result .[[Type]] 是return,则返回 NormalCompletion( result .[[Value]])。
  2. ReturnIfAbrupt(结果)。
  3. 返回 NormalCompletion( undefined )。

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

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