js柯里化——adder(1)(2,3)(5)()

本文探讨了两种JavaScript函数实现:一种是通过递归方式实现任意数量参数的加法运算,另一种是利用闭包特性实现累积加法,即连续调用时能记住前次结果并进行累加。

1、 

function adder( me ) {
    var slice = Array.prototype.slice, args = slice.call(arguments); 
    return function () {
        var inargs = slice.call(arguments); 
        if( arguments.length == 0 ){ 
            var me = 0 ; 
            for(var i in args){ 
                me +=args[i]; 
            } 
            return me ;
        } 
        else  return adder.apply(this, args.concat(inargs))}; 
   
}
console.log(adder(1)(2,3)(5)());

2、

function add(x) {
        //由于要一个数记住每次的计算值,所以使用了闭包,在addFake中记住了x的值,第一次调用add(),初始化了addFake,并将x保存在addFake的作用链中,然后返回addFake
        //保证了第二次调用的是addFake函数,后面的计算都是在条用addFake, 因为addFake也是返回的自己,保证了第二次之后的调用也是调用addFake,而在addFake中将传入的
        //参数与保存在作用链中x相加并付给x,这样就保证了计算;但是在计算完成后还是返回了addFake这个函数,这样就获取不到计算的结果了,我们需要的结果是一个计算的数字
        //那么怎么办呢,首先要知道JavaScript中,打印和相加计算,会分别调用toString或valueOf函数,所以我们重写addFake的toString和valueOf方法,返回x的值
        function addFake(y) {
            x = x + y;
            return addFake;
        };
        addFake.toString = addFake.valueOf = function() { return x; };
        return addFake;
    }
    console.log(add(1)(2)(3)(4)(2));

简化上面

const myadd=(x)=>ak=(y)=>(x = x + y, ak).toString=ak.valueOf=()=>x;
console.log(add(1)(2));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风儿轻丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值