Javascript return语句是从内部到外部工作的吗?
我一直在努力使用javascript中的return语句。这是 下面是我编写的一个函数,它将二进制数转换为十进制数:Javascript return语句是从内部到外部工作的吗?,javascript,Javascript,我一直在努力使用javascript中的return语句。这是 下面是我编写的一个函数,它将二进制数转换为十进制数: function bin2dec(num){ **return** num.toString().split('').reverse().reduce(function(preVal, currentVal , iterator){ **return** (currentVal === '1') ? preVal + Math.pow(2, iterato
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);
它迭代数组的每个部分,在本例中,除非
currentVal==1。“return”值被传递到回调,并且是preVal的值。对于我们正在添加的每个循环,并基于pre-val中的当前val进行构建。当对数组中的每个项进行迭代时,return语句是最终值。然后,从尚未执行的第一个return语句返回该最终值
有时我真的会被返回语句弄糊涂。我主要是想检查我在“return”语句中的逻辑是否与我描述的方式相同。简单回顾一下
如果您发现这种函数式编程很难掌握,那么将其拆分为更小的部分。以下代码与您的代码等效:
function bin2dec(num) {
var decimal = num.toString().split('').reverse().reduce(addDigit, 0);
return decimal;
}
function addDigit(preVal, currentVal, iterator) {
return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal;
}
将“return”视为“产生一个值”,而不是“从一块代码中退出”,这也会有所帮助。让我们看看
评估为:
如果省略表达式,则返回值为undefined
。否则,返回值为表达式的值
你看,没有关于其他返回语句的消息。任何表达式在return语句中都是有效的,而表达式的确切含义并不重要
接下来的问题是
num.toString().split(“”).reverse().reduce(…)
到底是什么,以及如何计算它
num.toString().split(“”).reverse().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);
}
谢谢你的提示。我正试图以我所做的方式对它的实施有一个清晰的认识。实际上,我在第一次尝试时就有了您当前的代码,但我想尝试将其压缩为一个函数。在插入return语句以使当前版本正常工作时,我有些猜测。我认为我关于这两个returns语句如何工作的逻辑是正确的,但我只是想再次检查我的想法是否正确。@HelloWorld:您的代码和理解都很好。像您一样使用匿名函数是可以的;只要保持内部函数的小,就不会影响可读性。
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);
}