一个方法:多参数的函数 转换为 可多次传参的函数
作用目标:函数 可将函数进行柯里化
方法本质:JS预处理,降低通用性,提高适用性
前期在满足条件下,返回新函数来接收剩余的参数,直到接收完全部的参数,才执行该函数 。
function curry(callback) {
return function fn() {
// 当前返回的新函数fn 获取实参并判断其个数
// 如果传递的实参长度不够(小于形参个数)则继续返回函数
var arg1 = Array.from(arguments);
if (arguments.length < callback.length) {
// 保留当前已传递的全部实参
// var arg1 = Array.from(arguments);
return function fnn() {
// 当前返回的新函数fnn 后续继续获取实参并判断其个数
// 保留当前已传递的全部实参
var arg2 = Array.from(arguments);
return fn(...(arg1.concat(arg2)));
// 利用递归,进行fn的自调,再对拼接后的实参进行个数判断
}
} else if (arguments.length == callback.length) {
// 如果传递的实参长度足够则直接执行callback
return callback(...arguments);
}
}
}
function demo(a, b, c, d) {
return a + b + c + d;
};
console.log(curry(demo)(1, 2)(4)); // 输出函数fnn
console.log(curry(demo)(1, 2)(3, 4)); // 10
var fn = curry(demo);
var fn1 = fn(1, 2);
var fn2 = fn1(3, 4);
console.log(fn2); // 10