SOURCE

// 实现一个compose
// 第一个参数函数可以传多个值
// 其余函数只有一个参数且为上一次函数调用的结果
const compose = (...args) => {
    let fn1 = args[0]
    let someRes
    return function (..._args) {
        someRes = fn1(..._args)
        for (let i = 1; i < args.length; i++) {
            const fn = args[i]
            someRes = fn(someRes)
        }
        return someRes
    }
}

// ES6
const compose2 = (...args) => {
    if (!args) {
        return arg => arg
    }
    if (args.length === 1) {
        return args[0]
    }
    return args.reverse().reduce((a, b) => (..._args) => a(b(..._args)))
}

let sayHello = (...str) => `Hello , ${str.join(" And ")}`;
let toUpper = str => str.toUpperCase();
let combin = compose2(
    sayHello,
    toUpper
);

console.log(combin("jack", "bob")); // HELLO , JACK AND BOB
console 命令行工具 X clear

                    
>
console