函数柯里化是把接受多个参数的函数转化为接收单个参数的函数
简单的例子:
// 普通函数
function sum(x, y) {
return x + y;
}
console.log(sum(1, 2)); // 结果输出3
// 柯里化
function curry(x) {
return function(y) {
return x + y
}
}
console.log(curry(1)(2)); // 结果也是输出3
显然,柯里化之后函数return函数,只需要一次传入一个参数,最终会返回最后的值,但是要是有n个参数,要是手动return n个函数显然不靠谱,所以我们可以换一个方式:统计传进来的参数个数,然后使用递归的方式处理
代码如下:
function add() {
let args = Array.from(arguments); // 定义一个变量args存储所传参数,并获取第一次传入的参数,并把它们放入args中
// 上面也可以用Array.prototype.slice.call(arguments)讲arguments数组化,此处记得要做数组化,因为arguments是类数组,并不是数组
let innerFn = function() { // 定义一个内部函数
let innerArgs = Array.from(arguments); // 后续内部函数传入的参数
if(innerArgs.length === 0 ) { // 此处是递归出口,当没有传入参数时就表示直接处理所传所有参数了,如果有继续传参数,则继续调用自身
return args.reduce( (prev, next) => prev + next)
} else {
args.push(...innerArgs); // 如果继续传参,则将参数放入最开始的args中,这里就是为什么上面要将arguments数组化,不然不能使用push方法
return innerFn;
}
}
return innerFn;
}
let sum1 = add(1, 3, 5)(); // 结果为9
let sum2 = add(1, 3, 5)(4, 6); // 结果为一个函数
let sum3 = add(1, 3, 5)(4, 6)(); // 结果为19
欢迎各位指正,并给出更好的方法