我正在学习 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/