04 compose 组合和柯里化

74 阅读1分钟

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);
    };
}