2014-02-18 57 views
0

我一直在javascript中使用return语句。这是msdn definitionreturn语句是从内部工作到外部工作的吗?

下面是我写的一个二进制数转换为十进制数的函数:

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函数返回值的更多细节。

在回调:

// 101 
    .reduce(function(preVal, currentVal , iterator){ 
      return (currentVal === '1') ? preVal + Math.pow(2, iterator) : preVal; 
     }, 0); 

它的阵列中的每个部分遍历,在这种情况下,“返回”是普雷瓦尔除非 currentVal === 1.“返回”值被传递给回调并且是preVal的值。对于每个循环,我们将添加并建立在来自pre val的当前val上。当数组中的每个项目都迭代时,return语句就是最终的值。最终的值然后从尚未执行的第一个return语句返回。

我真的迷失在回报声明有时。我主要试图检查我的逻辑在'返回'陈述如何以我描述的方式行事。对于一个快速回顾

  1. 首先返回 - 等待一切进行评价,有一个 对象返回。

  2. 第二回 - 用于回调,当它完成 迭代,则返回最后一个返回值,则该值是 从最终爆发的功能 第一return语句采取行动。

回答

1

让我们看看how the return statement is defined

return [no LineTerminator here] Expression ; 

和被评价为

如果省略表达,返回值是undefined。否则,返回值是表达式的值。

你看,没有关于其他返回语句的字。 任何表达式在返回语句中是有效的,并不重要什么表达式正是。


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

它还可以帮助想“回归”为“得到的值”,而不是“从代码块退出”。

+0

感谢您的提示。我试图按照自己的方式清楚地了解它的实施情况。我在第一次尝试时实际上已经有了你的当前代码,但是想尝试将它凝聚成一个函数。当插入返回语句以使我的当前版本正常工作时,我有点猜测。我想我的逻辑关于如何两个返回语句正常工作是正确的,但我只是想检查我正确思考。 – HelloWorld

+1

@HelloWorld:你的代码和你的理解都很好。像你一样使用匿名函数是可以的;只要你保持内部函数小,它不应该伤害可读性。 –