通过函数柯里化加强对js函数的认识。
普通柯里化
function a(b: number) {
return function (c: number) {
return b + c;
};
}
a(1)(2);
进阶柯里化
function add(...args: any) {
return args.reduce((a: any, b: any) => a + b, 0);
}
function b(func: any) {
const args: any[] = [];
return function result(...rest: any[]) {
// rest拿到的是数字
if (rest.length === 0) {
return func(...args);
} else {
args.push(...rest);
return result;
}
};
}
let sum = b(add);
sum(1)(2)(3); // 未计算(延迟计算的作用)
sum(1)(2)(3)(); // 计算
进阶面试
function c(...arg: any) {
const _args = Array.prototype.slice.apply(arg);
let _add = (...args: any) => {
_args.push(...args);
return _add;
};
_add.toString = () => {
return _args.reduce((a: any, b: any) => a + b, 0);
};
return _add;
}
console.log(c(1, 2, 4)()(3)(2)(1).toString());
相对于dom操作函数柯里化对性能的影响可以基本忽略不计。
通过对函数柯里化的认识也使得对函数的封装能力有了进一步的提升。