我正在学习JavaScript编程课程,教师说典型的JavaScript函数总是返回一个值。即使我们没有提供任何明确的返回值,引擎也会返回undefined
。
这是真的吗?如果是这样,为什么?
答案 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)
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]]内部方法时,将执行以下步骤:
答案 3 :(得分:2)
在javascript中,函数是对象。因此,您始终可以将函数分配给变量,就像分配任何其他对象一样,并且解释器将强制确定一个值(可能是未定义的。)