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

时间:2013-06-27 07:24:36

标签: javascript return-value netbeans-7

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

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

今天我为Javascript函数做了同样的事情,Netbeans将@returns {undefined}部分添加到评论方案中,即使后续函数没有返回任何内容。

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

4 个答案:

答案 0 :(得分:167)

简短的回答是否。

真正的答案是肯定的:必须通知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
}

此外,在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

在某些非常低级别,返回被转换为某种跳转。如果一个函数真的没有返回 nothing ,那么就无法知道调用下一个函数的内容和时间,或者调用事件处理程序等。

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

答案 1 :(得分:22)

不,返回是没有必要的。

返回实际上不会返回undefined

答案 2 :(得分:2)

不,你不必为每个功能都返回一些东西。它是可选的,直到您编写代码逻辑的方式。

答案 3 :(得分:2)

  

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

不,他们没有。的确,在规范的深处,它们全部略有不同

append

...但每个调用的结果相同:function foo() { } function foo() { return; } function foo() { return undefined; } 。因此,用务实的话来说:

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

重新规范:具体地说,当函数的执行落到最后时,规范中的执行是“正常”完成;但是return undefined;return;都是具有相关值(return value;)的“返回”补全,该值(略有不同)。但是calling a function的语义消除了这种差异,该语义表示:

  

...

     
      
  1. 如果结果。[[Type]]是undefined,则返回NormalCompletion(结果。[[Value]])。
  2.   
  3. ReturnIfAbrupt( result )。
  4.   
  5. 返回NormalCompletion(未定义)。
  6.   

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