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

标签 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 语句返回最终值。

有时我真的对 return 语句感到困惑。我主要是想检查“return”语句的逻辑是否按照我所描述的方式运行。快速回顾

  1. 第一次返回 - 等待所有内容都被评估,因此有一个 要返回的对象。

  2. 第二次返回 - 用于回调以及完成时 迭代,返回最后一个返回值,则该值为 从最终爆发的第一个 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/

相关文章:

javascript - 隐藏其他数据目标或与当前不同的 div

javascript - 为什么当我点击按钮时相关节点的子节点没有删除?

javascript - 使用 jQuery 删除所有数据表

javascript - 将图像居中并缩放高度/宽度以适合 flexbox 父级?

javascript - Highcharts 甘特图 (JS) - 删除 x 轴中的日期

javascript - 使用 Typeahead.js 突出显示多个单词

Javascript 只允许文本值

javascript - 如何使用javascript停止拖放中的div重叠

javascript - 带有弹出窗口的交互式签到页面

Javascript 时间与 PHP 时间,不一样