一.什么是函数的柯里化
所谓函数的柯里化就是把具有较多参数的函数转换成具有较少参数的函数的过程。简单来说,柯里化就是帮助我们处理某一个函数(含较多参数)
二.实例引出
直接上传一段代码如下:
//以前的方法
function add(a, b, c, d) {
return a + b + c + d
}
console.log(add(1,2,3,4)) //10
//ES6的原始方法
function add(a = 1, b = 2, c, d) {
return a + b + c + d
}
console.log(add(undefined,undefined,3,4)) //10
//只有在未传递参数或者参数为undefined时,才会使用默认参数
根据定义,我们需要实现函数传递一个又一个参数,在不影响最终结果的情况下实现这种效果,如下:
console.log(add(1,2)(3)(4)) = 10
console.log(add(1)(2)(3)(4)) = 10
console.log(add(1,2)(3,4)) = 10
//console.log(add(1,2)(3,4)) //报错add()()is not defind
//但实际上会报错
于是,我们需要借助一种方法来达到上述目的。因此引入了函数的柯里化。
三.柯里化使用
解释:
function Curry(fn) { //柯里化功能函数
// 此处省略若干行代码
}
var newAdd = Curry(add) //返回一个新函数,newAdd就是经过柯里化处理的函数
注意:如果函数参数传递完成,会直接执行,没有传递完成,会继续返回一个函数并期待下一次调用函数的时候能够把参数传递完成
代码展示如下:
//使用
function add(a,b,c,d) {
return a + b + c + d
}
//console.log(add.length) //4
function curry(fn,args) {
var length = fn.length //声明函数传参数量
args = args || [] //
//柯里化过程
return function(...rest) { //调用函数,并传递参数
var _args = [...args,...rest] //新的数组,arg:初始情况下(不传参)为[]
return _args.length < length ? //判断参数是否传递完,如果没有传递完,继续返回上面传递参数的函数,否则执行柯里化后的函数
curry.call(this,fn,_args) :
fn.apply(this,_args)
}
}
var newAdd = curry(add)
console.log(newAdd(1,2,3,4)) //10
console.log(newAdd(1,2)(3)(4)) //10
console.log(newAdd(1)(2)(3)(4)) //10
console.log(newAdd(1,2)(3,4)) //10