Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript return语句是从内部到外部工作的吗?_Javascript - Fatal编程技术网

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

我一直在努力使用javascript中的return语句。这是

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

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