解析通用版的JS函数柯里化

37 篇文章 0 订阅
24 篇文章 0 订阅

什么是柯里化?

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换
成接受一个单一参数(最初函数的第一个参数)的函数,
并且返回接受余下的参数且返回结果的新函数的技术。

函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行。

function curry(fn, args) {
    var length = fn.length;
    var args = args || [];
    return function(){
        newArgs = args.concat(Array.prototype.slice.call(arguments));
        if (newArgs.length < length) {
            return curry.call(this,fn,newArgs);
        }else{
            return fn.apply(this,newArgs);
        }
    }
}

function multiFn(a, b, c) {
    return a * b * c;
}

var multi = curry(multiFn);

console.log(multi(2)(3)(4)); //24
console.log(multi(2,3,4)); //24
console.log(multi(2)(3,4)); //24
console.log(multi(2,3)(4)); //24

细节解释:

1.fn.length =》

每个函数都有一个 length属性 (函数名.length), 表示期望接收的函数的个数(而不是实际接收的参数个数)

(它与arguments不同。 arguments.length 是表示函数实际接收的参数个数。)

arguments也是每个函数都有的一个属性。

参考链接:https://www.cnblogs.com/dubaokun/p/3603833.html

 

2.Array.prototype.slice.call(arguments) =》

其实本质就是arguments这个对象使用了数组的slice这个方法,得到了参数构成的数组(也可以用apply)。

参考链接:https://www.cnblogs.com/papi/p/9234964.html

 

3.args.concat =》

concat() 方法用于连接两个或多个数组。

该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

 

4.if (newArgs.length < length)  =》

结合上下文,意思是如果得到的参数,少于该函数本身期待的参数

 

5.return curry.call(this,fn,newArgs); =》

这行代码意思是,curry方法再执行一次,传入参数fn,newArgs,并且把curry方法的this改变为

return function(){xxx}

参考链接:https://uule.iteye.com/blog/1158829

 

6.return fn.apply(this,newArgs);

apply方法,类似call方法,接受的是参数数组

结合上下文,如果得到的参数,等于或多于该函数本身期待的参数,执行传入的方法

参考链接:https://uule.iteye.com/blog/1158829

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值