javascript - 为什么 JavaScript 函数总是有返回值?

标签 javascript

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

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

最佳答案

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

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

static 语言中,通常会区分不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();
   }
}

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

是的,有问题:如果我们把一个普通的 return 放在一起会发生什么?进入一个应该计算某些东西的函数?请注意,我们不能取缔这一点:我们早期的决定之一是让 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得到一个意思“返回undefined ”。

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

因此,唯一合乎逻辑的结论是 undefined如果函数未通过显式 return <value> 指定“默认”返回值运算符(operator)。因此,return和 function-executed-to-its-end 语义匹配。

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

关于javascript - 为什么 JavaScript 函数总是有返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20915450/

相关文章:

Javascript - 如何替换 anchor 的 href 包含的特定出现?

javascript - Google Charts API : Highlighting closest Datapoints between 2 series. 怎么办?

javascript - Javascript 代码在浏览器中的不同输出

javascript - 如何在 json 请求中放置变量

javascript - 悬停时在相对标签内滚动绝对图像

javascript - IFRAME 和后退/前进按钮

javascript - 谷歌地图标记 php

javascript - JavaScript 过滤器的替代返回 - 如果未找到客户端则显示消息

javascript - 为什么 mongodb-native 驱动程序中有单独的 mongo.Server 和 mongo.Db?

javascript - 目标 SVG 路径到矩形元素的中间