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