函数柯里化指的是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术
ES5
//不确定参数
function curry(fn, args) {
// 获取函数需要的参数长度
let length = fn.length;
args = args || [];
return function() {
let subArgs = args.slice(0);
// 拼接得到现有的所有参数
for (let i = 0; i < arguments.length; i++) {
subArgs.push(arguments[i]);
}
// 判断参数的长度是否已经满足函数所需参数的长度
if (subArgs.length >= length) {
// 如果满足,执行函数
return fn.apply(this, subArgs);
} else {
// 如果不满足,递归返回科里化的函数,等待参数的传入
return curry.call(this, fn, subArgs);
}
};
}
//确定参数
function add(a, b, c) {
return a + b + c;
}
// 使用函数柯里化转换add函数
function curriedAdd(a) {
return function(b) {
return function(c) {
return a + b + c;
}
}
}
// 使用柯里化后的函数进行调用
curriedAdd(1)(2)(3); // 输出:6
ES6
//不确定参数
function curry(fn, ...args) {
return args.length >= fn.length ? fn(...args) : curry.bind(null, fn, ...args);
//如果存起来的实参数量 比 fn的形参 多,则直接调用fn
//如果还存不够,则继续存
}
//确定参数
function add(a, b, c) {
return a + b + c;
}
const curriedAdd = add.bind(null, 1);
const result = curriedAdd(2, 3); // 输出:6
应用
1.参数确定(累加参数确定)
function sum(a,b,c,d){
return a+b+c+d
}
let curried = curry(sum)
console.log(curried(1)(2)(3)(4))//10
console.log(curried(1,2)(2,4))//9
2.不确定参数实现sum([1,2,3…])无限累加
function add(arr){
return arr.reduce((acc,item)=>{
return acc+item
},0)
}
let curried = curry(add)
console.log(curried([1,2,3,4,5])