函数科里化
定义
函数柯里化又叫部分求值,维基百科中对柯里化 (Currying) 的定义为
柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
实现
function currying(fn) {
return function (...args) {
return args.length >= fn.length // 新函数接收的参数长度是否大于等于 fn 剩余参数需要接收的长度
? fn.apply(this, args) // 满足要求,执行 fn 函数,传入新函数的参数
: currying(fn.bind(this, ...args)); // 不满足要求,递归 currying 函数,新的 fn 为 bind 返回的新函数(bind 绑定了 ...args 参数,未执行),新的 length 为 fn 剩余参数的长度
};
}
// 极简版currying实现
// const currying = (fn) =>
// (judge = (...args) =>
// args.length >= fn.length
// ? fn(...args)
// : (...arg) => judge(...args, ...arg));
const add = currying((a, b, c) => a + b + c);
console.log(add(1)(2)(3));
console.log(add(1, 2)(3));
实际应用 - 延迟计算
function currying1(fn) {
return function (...args) {
return args.length === 0 // 函数执行时机,直到最后一次不传参调用时执行
? fn.apply(this, args)
: currying1(fn.bind(this, ...args));
};
}
const add1 = currying1((...args) => args.reduce((a, b) => a + b));
console.log(add1(1)(2)(3)());
console.log(add1(1, 2)(3)(4)());
console.log(add1(1, 2)(3)(4, 5)(6)());