// 实现一个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