compose 组合
function compose(...fns) {
return function (...args) {
if (fns.length === 1) {
return fns[0].apply(null, args);
}
return fns.reverse().reduce((prev, curr) => {
return typeof prev === "function"
? curr(prev.apply(null, args))
: curr(prev);
});
};
}
// 示例:
const sum = (x) => x + 4;
const minus = (x) => x - 3;
const multiple = (x) => x * 2;
const devide = (x) => x / 1;
const fn = compose(sum, minus, multiple, devide);
fn(1)
// 等价于
sum(minus(multiple(devide(1))))
函数柯里化
- 多参数函数转为单一参数函数队列
- 单一指责、延迟执行
每次可以传入多个参数
function curry(fn) {
if (fn.length === 1) return fn;
return function inner(...args) {
if (args.length >= fn.length) return fn.apply(null, args);
return (...args1) => inner(...args, ...args1);
};
}
// 示例
function sum(a, b, c, d) {
return a + b + c + d;
}
var fn = curry(sum);
fn(1)(2, 3)(4)
每次只能传入单一参数
function curry1(fn) {
if (fn.length === 1) return fn;
const args = [];
return function inner(arg) {
args.push(arg);
if (args.length >= fn.length) return fn.apply(null, args);
return (arg) => inner(arg);
};
}