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

为什么JavaScript函数总是返回一个值?,javascript,Javascript,我正在学习一门JavaScript编程课程,老师说一个典型的JavaScript函数总是返回一个值。即使我们不提供任何显式返回值,引擎也返回未定义的 这是真的吗?若然,原因为何 即使我们不提供任何显式返回值,引擎也返回“未定义”。这是真的吗 不是真的。据我所知,一个什么都不返回的函数…什么都不返回。也就是说,如果将变量分配给此类函数调用的结果,则表达式的计算结果将为undefined 编辑 我被纠正了。以下是规范的相关部分: 13.2.1[[呼叫]] 当使用this值和参数列表调用函数对象F的

我正在学习一门JavaScript编程课程,老师说一个典型的JavaScript函数总是返回一个值。即使我们不提供任何显式返回值,引擎也返回
未定义的

这是真的吗?若然,原因为何

即使我们不提供任何显式返回值,引擎也返回“未定义”。这是真的吗


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

编辑

我被纠正了。以下是规范的相关部分:


13.2.1[[呼叫]]

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

  • 如10.4.3所述,使用F的[[FormalParameters]]内部属性值、传递的参数列表args和该值为函数代码建立新的执行上下文后,就可以使用FunctX
  • 让result作为对FunctionBody求值的结果,FunctionBody是F的[[Code]]内部属性的值。如果F没有[[Code]]内部属性或其值为空FunctionBody,则结果为(正常、未定义、空)
  • 退出执行上下文functctx,恢复以前的执行上下文
  • 如果result.type为throw,则抛出result.value
  • 如果result.type为return,则返回result.value
  • 否则,result.type必须为normal。返回未定义

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

    这是由

    13.2.1[[呼叫]]。。。 6.否则,result.type必须为normal。返回未定义

    本质上,任何JS函数都被编译为隐式
    返回未定义结尾处:

    function foo() {
      ...
    
      return undefined; // implicit non-visible statement  
    }
    

    这是真的,因为JavaScript就是这样设计的

    但我认为这不是你想要的答案,所以让我们考虑一下……
    试着设身处地为设计JavaScript的人着想

    静态语言中,通常会将不做任何事情的函数(
    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');
    }
    

    我们可能想退出中间的函数,因为Reale>代码>已经做到了这一点,允许编写<代码>返回<代码>是没有意义的,不支持这个用例:

    function doSomething(num) {
       if (num === 42) {
         return;
       }
    
       while (true) {
         doSomethingElse();
       }
    }
    
    这也与C/Java语法一致,这是确保JavaScript采用的目标之一

    是的,问题是:如果我们把一个普通的
    返回值
    放进一个应该计算某些东西的函数中,会发生什么?请注意,我们不能取缔这一点:我们之前的一个决定是使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); // ???
    
    当然,Brendan本可以决定在这种情况下提出错误,但他明智地决定不提出,因为这将导致难以发现错误和太容易破解的代码

    因此,一个空的
    return
    表示“return
    未定义”

    但是函数提前返回或在结束时返回有什么区别呢?从调用代码的角度来看,不应该有任何错误。调用代码不应该知道函数返回的确切时间;它只对返回值(如果有)感兴趣

    因此,唯一合乎逻辑的结论是,如果函数没有通过显式
    返回
    运算符指定一个返回值,则将
    未定义
    作为“默认”返回值。因此,
    返回
    并将执行的函数与其结束语义匹配


    Python是JavaScript之前的另一种动态语言,它以同样的方式解决了这个问题:。

    如果没有函数返回值(例如,如果将函数返回值赋给某个变量),那么函数返回值应该包含哪些内容?:)我认为应该是“未定义的”。还有什么可以替代呢?:)如果每个函数都返回一些东西,那么编写js引擎就更容易了,对于显示为未定义的缺失属性也是如此。现在,如果它返回的是尾值而不是未定义的值,那就好了……谢谢@Dan——恐怕我能提供的报酬只有几张赞成票和一枚铜牌了:)“不返回任何东西的函数……不返回任何东西”不是真的。JS中没有“nothing”值。对于不带值的return语句,它“精确地返回‘undefined’”。请参阅:12.9 ECMA规范中的return语句。鼓起勇气纠正错误,让所有人都看到。这不是关于函数对象,而是关于函数调用。人们总是抱怨JavaScript的不好部分,还有很多,但男孩,语言中有太多的部分非常漂亮。答案很好!您可以分析此设计决策的含义和原因,而不只是重复规范的一部分。“默认/未定义”值的概念在语言中通常是有用的。一旦引入了一个参数,您就可以做一些简单的事情,比如检查是否传递了参数(就像在JS中所做的那样),如果不从void函数返回undefined,那就很奇怪了。