return语句是从内到外工作的吗?

时间:2014-02-18 16:33:17

标签: javascript

我一直在用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语句返回该最终值。

我有时会对返回陈述感到迷茫。我主要试图检查我的逻辑如何“返回”语句按照我描述的方式行事。快速回顾一下

  1. 第一次返回 - 等待评估的所有内容,以便有一个 要返回的对象。

  2. 第二次返回 - 用于回调以及何时完成     迭代,返回最后一个返回值,然后该值为     从最终爆发的第一份退货声明中起作用     功能。

2 个答案:

答案 0 :(得分:1)

如果您发现这种功能性的编程风格难以掌握,那么将其拆分为较小的部分。以下代码与您的代码相同:

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;
}

将“返回”视为“产生价值”,而不是“退出代码块”也是有帮助的。

答案 1 :(得分:1)

让我们看how the return statement is defined

return [no LineTerminator here] Expression ;

并将其评估为

  

如果省略 Expression ,则返回值为undefined。否则,返回值是 Expression 的值。

你知道,没有关于其他返回语句的消息。 任何表达式在return语句中都有效,表达式无关紧要。


后续问题是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);
}