为什么JavaScript函数总是返回一个值?

时间:2014-01-04 00:56:55

标签: javascript

我正在学习JavaScript编程课程,教师说典型的JavaScript函数总是返回一个值。即使我们没有提供任何明确的返回值,引擎也会返回undefined

这是真的吗?如果是这样,为什么?

4 个答案:

答案 0 :(得分:89)

这是真的 - 因为这就是JavaScript的设计方式。

但我认为这不是你要找的答案,所以让我们考虑一下......
试着让自己置身于Brendan Eich,设计JavaScript的人!

静态语言中,通常在不return任何事物(void函数)的函数和返回某个值的函数之间存在区别。 Brendan选择设计一种动态语言,即一种不需要您定义函数返回类型的语言。因此,JavaScript 不会检查您从函数中返回的内容,从而为您提供充分的自由。

您可以拥有一个返回数字的函数......

function computeSomething() {
  return 2;
}

...或字符串......

function computeSomething() {
  return 'hi';
}

......或者,事实上,其中任何一个:

function computeSomething() {
  if (Math.random() > 0.5) {
    return 2;
  } else {
    return 'hello';
  }
}

有时你不需要计算任何东西 - 你只需要某事 所以你不要退货。

function doSomething() {
   console.log('doing something');
}

但是,我们可能希望在其中间退出一个函数,并且由于return <value>已经完全,所以允许在没有return的情况下编写function doSomething(num) { if (num === 42) { return; } while (true) { doSomethingElse(); } } 是有意义的支持此用例的值:

return

这也与C / Java语法一致,这是确保JavaScript采用的目标之一。

是的,有一个问题:如果我们将一个普通的function computeSomething(num) { if (num === 42) { return; // just return? o_O } if (Math.random() > 0.5) { return 2; } else { return 'hello'; } } var x = computeSomething(2); // might be 2, might be 'hello' var y = computeSomething(42); // ??? 放入一个应该计算某事的函数中会发生什么?请注意,我们不能取缔这个:我们之前做出的一个决定是将JavaScript变为动态语言,我们不会检查函数返回的内容。

return

当然Brendan本可以决定在这种情况下提出错误,但他明智地决定不这样做,因为这会导致难以发现的错误和太容易破解的代码。

所以空undefined的意思是“返回undefined”。

但是早期或最后返回的函数有什么区别?从调用代码的角度来看,应该没有任何东西。当确切地返回函数时,调用代码不应该知道;它只对返回值感兴趣(如果有的话)。

因此,唯一合乎逻辑的结论是,如果函数未通过显式return <value>运算符指定一个,则将return设为“默认”返回值。因此,{{1}}和函数执行到它的结束语义匹配。

Python是JavaScript之前的另一种动态语言,它以同样的方式解决了这个问题:None is returned if function doesn't specify return value

答案 1 :(得分:13)

那是ECMAScript specification

  13.2.1 [[Call]] ......   6.否则result.type必须正常。返回undefined。

基本上任何JS函数都被编译为好像它最后有隐式return undefined;

function foo() {
  ...

  return undefined; // implicit non-visible statement  
}

答案 2 :(得分:7)

  

即使我们没有提供任何明确的返回值,引擎也会返回“undefined”。这是真的吗?

不是真的。据我所知,一个什么都不返回的函数......什么都不返回。也就是说,如果将变量分配给此类函数调用的结果,则表达式将计算为undefined

修改

我的立场得到了纠正。这是规范的相关部分:


13.2.1 [[Call]]

当使用此值和参数列表调用Function对象F的[[Call]]内部方法时,将执行以下步骤:

  1. 让funcCtx成为使用F的[[FormalParameters]]内部属性的值,传递的参数List args以及10.4.3中描述的该值为函数代码建立新执行上下文的结果。
  2. 让结果为评估作为F [[Code]]内部属性值的FunctionBody的结果。如果F没有[[Code]]内部属性或者其值为空FunctionBody,则结果为(normal,undefined,empty)。
  3. 退出执行上下文funcCtx,恢复先前的执行上下文。
  4. 如果result.type是throw,则抛出result.value。
  5. 如果result.type为return,则返回result.value。
  6. 否则result.type必须正常。返回undefined。

答案 3 :(得分:2)

在javascript中,函数是对象。因此,您始终可以将函数分配给变量,就像分配任何其他对象一样,并且解释器将强制确定一个值(可能是未定义的。)