我一直在努力处理 JavaScript 中的 return 语句。这是msdn definition
这是我编写的一个将二进制数转换为十进制数的函数:
function bin2dec(num){
**return** num.toString().split('').reverse().reduce(function(preVal, currentVal , iterator){
**return** (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal;
}, 0);
}
让我们以二进制中的 5 为例,计算 Binary5 = 101
所以我认为每当你使用 return 语句时,它就会过早地退出当前函数。
这里有两个返回语句,其中一个位于回调函数内。
第一个 return 语句位于第二行:
return num.toString().split('').reverse() // and then the reduce function w/ a call back.
我相信这个“return”语句正在等待reduce函数的返回
该函数获取数字,将其变成字符串,然后拆分,然后反转,然后reduce 方法迭代数组。当reduce函数完成时,它返回一个值,然后该值也由第一个返回值返回。以下是有关reduce 函数返回值的更多详细信息。
在回调中:
// 101
.reduce(function(preVal, currentVal , iterator){
return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal;
}, 0);
它迭代数组的每个部分,在这种情况下,“return”是 preVal,除非 currentVal === 1.“return”值被传递给回调,并且是 preVal 的值。对于每个循环,我们都在前 val 的当前 val 的基础上添加和构建。当数组中的每个项目都被迭代时,return 语句就是最终值。然后从尚未执行的第一个 return 语句返回最终值。
有时我真的对 return 语句感到困惑。我主要是想检查“return”语句的逻辑是否按照我所描述的方式运行。快速回顾
第一次返回 - 等待所有内容都被评估,因此有一个 要返回的对象。
第二次返回 - 用于回调以及完成时 迭代,返回最后一个返回值,则该值为 从最终爆发的第一个 return 语句开始执行 的功能。
最佳答案
让我们看看how the return
statement is defined
return [no LineTerminator here] Expression ;
它被评估为
If Expression is omitted, the return value is
undefined
. Otherwise, the return value is the value of Expression.
你看,没有任何关于其他返回语句的文字。 任何表达式在返回语句中都是有效的,并且表达式到底是什么并不重要。
<小时/>接下来的问题是 num.toString().split('').reverse().reduce(...)
到底是什么以及如何评估它。
num.toString().split('').reverse().reduce(...)
是一个调用表达式,该表达式的结果是函数的返回值。
那么reduce
是如何工作的呢? reduce
将数组转换为单个值。它通过为数组中的每个元素执行一个函数并将上一次迭代的该函数的返回值传递给下一次迭代来实现这一点。
所以底线是两个 return
语句彼此没有任何关系,它们是完全独立的。如果您事先定义了该函数,可能会更容易查看:
function bin2dec(num){
function callback(preVal, currentVal , iterator){
return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal;
}
return num.toString().split('').reverse().reduce(callback, 0);
}
关于javascript - return语句是从内到外工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21859806/