自动柯里化函数的功能
- 将普通函数柯里化,返回柯里化后的函数。
function change(fn) {
const resultFn = function (...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function (...restArgs) {
return resultFn.apply(this, [...args, ...restArgs]);
};
}
};
return resultFn;
}
function sum(x, y, z) {
return x + y + z;
}
const newSum = change(sum);
console.log(newSum(1)(2)(3));
console.log(newSum(1, 2)(3));
console.log(newSum(1, 2, 3));
自动柯里化函数的不足之处
function sum(x, y, z) {
console.log("x的逻辑操作");
console.log("y的逻辑操作");
console.log("z的逻辑操作");
return x + y + z;
}
const newSum = change(sum);
const add5 = newSum(5);
console.log(add5(1)(2));
console.log(add5(10)(20));
const changeSum = function (x) {
console.log("x的逻辑操作");
return function (y) {
console.log("y的逻辑操作");
return function (z) {
console.log("z的逻辑操作");
return x + y + z;
};
};
};
const add10 = changeSum(10);
console.log(add10(1)(2));
console.log(add10(10)(20));
- 只是调用方式变得柯里化了。前期利用闭包收集参数,在最后一步执行原函数。
- 真正的柯里化函数,是可以逻辑复用的。即逻辑复用那部分可以不需要重复调用,直接使用第一次调用的结果即可。
- 如果不在乎逻辑处理是否执行多次,那么在代码形式上(编写代码时不需要每次传固定的参数),也可以认为自动柯里化函数实现了逻辑复用。
自动柯里化函数涉及到的知识汇总
- 闭包。函数引用外部变量。
- 实参、形参、剩余参数的个数判断。(arguments、函数.length、...args)
- this的指向。原函数在执行时,往往需要将this绑定为包装函数的this。
- 递归。(在不确定层级或循环次数时,使用递归或while循环。)
- 柯里化的概念及优势。(优势:函数职责单一、逻辑复用。)