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

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

到目前为止,我一直使用这只是为 PHP 语言,在这种情况下,Netbeans 总是添加 @returns {type}部分在注释方案,如果下面的 PHP 函数真的包括 return语句。对于所谓的“过程”(不返回任何值的函数) ,此部分缺失。

今天我对 Javascript 函数做了同样的尝试,Netbeans 在注释方案中增加了 @returns {undefined}部分,即使后面的函数不返回任何内容。

这让我很困惑。Netbeans 是否建议每个 Javascript 函数都必须返回任何内容?我该怎么办?忽略(或删除)该注释方案的一部分或遵循建议(如果这是建议) ,并添加 return false;在这样的功能结束,虽然它是无用的我?

117446 次浏览

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

简短的回答是不行。

真的的回答是肯定的: 必须通知 JS 引擎某个函数已经完成了它的业务,这是通过返回某些内容的函数来完成的。这也是为什么对 "have returned"说一个函数而不是 “完成”的原因。
没有显式返回语句的函数将返回 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
}

而且,在 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

在一些 非常低水平,返回被转换成某种类型的跳转。如果一个函数真的返回了 没什么,那么就没有办法知道什么时候调用下一个函数,或者调用事件处理程序之类的。

So to recap: No, a JS function needn't return anything as far as your code goes. But as far as the JS engines are concerned: a function 一直都是 returns something, be it explicitly via a return statement, or implicitly. If a function returns implicitly, its return value will always be undefined.

不,不需要 return

如果未指定 return语句,则返回 undefined

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

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

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

...but the result of 打来的 each of them is the same: undefined. So in pragmatic terms:

  1. You don't have to write a return, you can just let code execution "fall off the end" of the function
  2. 如果返回的是 undefined,那么只需编写 return;
  3. 当调用一个函数时,您无法(在代码中)判断执行是结束执行、以 return;结束执行还是以 return undefined;结束执行; 它们在调用代码中看起来完全相同

Re the spec: Specifically, when a function's execution falls off the end, in the spec that's a "normal" completion; but return; and return value; are both "return" completions with an associated value (undefined), which is (ever so slightly) different. But the difference is eliminated by the semantics of 调用函数, which say:

...

  1. 如果 结果.[[ Type ]]为 return,则返回 NormalCompletion (结果.[[ Value ]])。
  2. 突然返回(结果)。
  3. 正常填写报税表(未定义)。

所以在代码中没有区别。