函数科里化
在⼀个函数中,⾸先填充一个或多个参数,然后再返回⼀个新的函数的技术,称为函数的柯⾥化。通常可⽤于在不侵⼊函数的前提下,为函数预置通⽤参数,供多次重复调⽤。
假如我们有一个加法函数,计算三个数的和。
function add(x,y,z){
return x+y+z
}
const result = add(1,2,3)
console.log(result)//6
根据科里化的思想可以写成如下
function _add(x) {
return function (y) {
return function (z) {
return x + y + z
}
}
}
const fun = _add(1)
const fun1 = fun(2)
const res = fun1(3)
console.log(res) //6
根据如上思路,可以看出柯里化函数的运行过程其实是一个个参数的收集过程,所以可以在函数内部将每一次传入的参数收集起来,当收集的参数满足条件时再调用函数。所以代码可以写成如下
function curry() {
//存放传入的函数
const fn = Array.prototype.shift.call(arguments)
//存放收集到的参数
let args = Array.from(arguments)
//返回一个新函数
return function () {
//存放调用新函数传入的参数
const newArgs = Array.from(arguments)
//合并接收到所有参数
args = args.concat(newArgs)
console.log(args)
//参数收集完毕时调用函数
if(fn.length == args.length){
return fn.apply(this,args)
}
//如果参数没收收集完成,掉用科里化函数返回新函数等待继续传参
return curry.call(this,fn,...args)
}
}
function add(x,y,z){
return x+y+z
}
const fn = curry(add,1)
const fn1 = fn(2) //[1, 2]
const result = fn1(3) //[1, 2, 3]
console.log(result) // 6