首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript问题的箭头函数-多箭头函数嵌套

JavaScript问题的箭头函数-多箭头函数嵌套
EN

Stack Overflow用户
提问于 2020-08-11 11:39:59
回答 3查看 96关注 0票数 2

当我在leetcode上练习JS时,我看到了一个答案,但我不能理解这是什么意思。任何人都可以扩展代码吗?或者告诉我怎么读这个。

https://leetcode.com/problems/running-sum-of-1d-array/discuss/702025/one-liner

代码语言:javascript
复制
let runningSum = nums => nums.map((sum => el => sum += el)(0));
console.log(runningSum([1,2,3,4]))

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-11 12:24:57

原始函数

代码语言:javascript
复制
let runningSum = nums => nums.map((sum => el => sum += el)(0));

(sum => el => sum += el)

代码语言:javascript
复制
function f1(sum) {
  return function f2(el) {
    return sum += el;
  }
}

(或者以@Alterlife显示的箭头格式)

然后,原始函数转换为

代码语言:javascript
复制
let runningSum = nums => nums.map(f1(0));

然后是nums.map(f1(0));

变成了

代码语言:javascript
复制
const result = [];
const f2 = f1(0);

for(let i = 0; i < nums.length; ++i) {
  const num = nums[i];
  result.push(f2(num));
}

因此,最初的函数全部转换为

代码语言:javascript
复制
const nums = [1,2,3,4];
function f1(sum) {
  return function f2(el) {
    return sum += el;
  }
}
const result = [];
const f2 = f1(0);

for(let i = 0; i < nums.length; ++i) {
  const num = nums[i];
  result.push(f2(num));
}
console.log(result);
票数 2
EN

Stack Overflow用户

发布于 2020-08-11 12:03:00

让我们试着把它分解一下。

(sum => el => sum += el),相当于:

代码语言:javascript
复制
const mySumFunction = (sum) => {

   const addToSum = (el) => { 
      sum += el;
      return sum;
   }

   return addToSum;
}

这是一个接受一个参数的函数--一个起始和。sum参数也是函数作用域中的局部变量。

当您调用mySumFunction时,它返回另一个函数,该函数添加到局部作用域变量sum中,并返回到目前为止的总和。

实际上,它创建了一个“带内存的函数”,该函数返回到目前为止传入的所有内容的总和。

您可以按如下方式进行测试:

代码语言:javascript
复制
cumilativeSum = mySumFunction(0)
console.log(v(1)) // returns 1
console.log(v(1)) // returns 2
console.log(v(4)) // returns 6

现在让我们把代码作为一个整体来看。

代码语言:javascript
复制
let runningSum = nums => nums.map((sum => el => sum += el)(0));

传递给map函数的整个代码片段:(sum => el => sum += el)(0)创建了一个从0开始的“带内存的sum函数”,正如我们上面所指出的那样。

我们将数组中的每个数字传递给它,并创建一个具有累积和的数组。

票数 2
EN

Stack Overflow用户

发布于 2020-08-11 12:37:20

让我们使用(sum => el => sum += el)(0)这个自调用箭头函数来进行映射的第一次迭代。在执行时,它返回另一个箭头函数el => sum += el。sum的值是作为参数传递的0。现在继续来看我们的地图第一次迭代

代码语言:javascript
复制
let runningSum = nums => nums.map(el => sum = 0 + el);

它返回1。因此,对于第二次迭代,sum的值是1,el是2。所以它返回3,然后是6,然后是10。

代码语言:javascript
复制
let runningSum = (nums) =>
  nums.map(
   (function (sum) {
         return (el) => (sum += el);
   })(0)
  );
console.log(runningSum([1, 2, 3, 4]));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63351154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档