大厂面试:js 闭包的深刻理解(实例分解:如何实现无限累加的一个函数)

18 篇文章 0 订阅
15 篇文章 0 订阅

知识储备:js闭包,递归函数,es6结构解析,js高阶函数,拓展运算符等。

题目:实现一个无限累加的js函数

sum(1, 2, 3).valueOf() //6
sum(2, 3)(2).valueOf() //7
sum(1)(2)(3)(4).valueOf() //10
sum(2)(4, 1)(2).valueOf() //9

分析:js里的闭包常见的是用函数作为返回值,那么,就会出现func()()这种形式的函数,也叫立即执行函数。故联想到本题应该利用闭包来实现上述函数。

重点:利用返回值是一个函数来接收下一个括号里的参数值,至于有多少层,我们不用关心。

step1:我们应当写出一下形式的函数了,其中a是当前括号接收的参数,b是后面的括号的参数。

function sum(...a) {
  const func = function(...b){
  }
  return func;
}

step2:至于a和b要做啥操作,做累加,故:

function sum(...a) {
  let result = 0;
  const func = function(...b){
      // result = ...a + ...b;
  }
  func.toResult = function(){
    return result;
  }
  return func;
}

这里我们用一个方法输出当前累加的值。

step4:图中注释部分扩展开来实现。

function sum(...a) {
  let resultA;
  resultA = a.reduce((x,y)=>{//a和b属于同一个函数的参数,自行累加
    return x+y;
  })
  const s = function(...b){
    let resultB = b.reduce((x,y)=>{
      return x+y;
    })
    resultA=resultA+resultB;
    return s;
  }
  s.valueOf = function () {//这里改成了题目中的valueOf
    return resultA;
  }
  return s;
}

即可实现上述函数,但是这就限定了我们只能做累加操作,不能实现其他自定义操作。有没有一种办法只合并参数,操作单独自定义呢?有。

function sum(...a) {
  const s = (...b)=>sum(...[...a,...b]);//参数合并
  
  let result = a.reduce((x,y)=>{//当前阶段求值
    return x+y;
  })
  s.valueOf = function () {//函数出口
    return result;
  }
  return s;
}

结果:

 闭包很有意思哈,哈哈哈。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值