php闭包累加计算,前端闭包题目——柯里化实现不限个数计算累加和

起初是朋友问我的一个题目,一起研究好一会

var add = function (x) {

var sum = 1;

var tmp = function (x) {

sum = sum + x;

console.log(sum, 'sum1')

return tmp;

}

console.log(sum, 'sum2')

console.log(tmp, 'tmp1')

tmp.toString = function () {

return sum;

}

console.log(sum, 'sum3')

console.log(tmp, 'tmp2')

return tmp;

}

console.log( add(1)(2)(3)(4) );

问: 控制台输出内容是什么?

结果:

286e3fbbf31e4db1db58c3e53e2499f8.png

为什么?怎么运行的?

在解决这些问题之前,我先要为自己解释一些基础问题。

先搞清楚add(1)(2)(3)(4),当一个函数里有多个形参的时候,就这样给它传入多个实参。

foo.toString函数被重写,会在每一次打印foo的时候都调用一次,且会由于闭包将返回的内容放在全局的作用域链上。

柯里化: 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

经典举例:

// 普通的add函数

function add(x, y) {

return x + y

}

// Currying后

function curryingAdd(x) {

return function (y) {

return x + y

}

}

add(1, 2) // 3

curryingAdd(1)(2) // 3

这个题目就是利用柯里化完成的不限个数的数字累加。

知道了这些再来看这道题,就相对容易理解了。

先来梳理运行顺序:

add() --> tmp() --> tmp() --> tmp()

第一轮运行add函数(此时tmp并没有运行),程序走到return,返回的是tmp函数,于是第二轮运行tmp函数,由于tmp函数返回的是自己,并且add(1)(2)(3)(4)调用还没有结束,所以第三轮还是运行tmp,第四轮运行还是tmp。

打印台输出:

第一轮输出sum2是1,tmp1是tmp函数本身,sum3是1,tmp2是fn返回1;第二轮输出sum1是3;第三轮输出sum1是6,第四轮输出sum1是10,函数返回10;

一通翻阅资料加上自我理解总结以上,如有不准确之处欢迎大佬们指正,如果有帮助到您也请多多点赞和评论呀~我是前端小桃,我在这里成长。

标签:闭包,tmp,return,函数,sum,累加,add,柯里化,console

来源: https://blog.csdn.net/megamind0430/article/details/110168679

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值