看到一个思考题挺有意思:有如下函数,聚合成一个函数,并把第一个函数的返回值传递给下一个函数,如何处理。
function f1(arg) {
console.log("f1", arg);
return arg;
}
function f2(arg) {
console.log("f2", arg);
return arg;
}
function f3(arg) {
console.log("f3", arg);
return arg;
}
当然最简单的实现就是函数执行,把函数当作参数嵌套执行即可
let res = f1(f2(f3("omg")));
如果要使用函数来实现的话就需要reduce来实现
let res = compose(f1, f2, f3)("omg");
function compose(...funcs) {
// 使用reduce处理
return funcs.reduce((a, b) => (...args) => a(b(...args)));
}
再考虑一种情况,如果没有传值呢,则需要多进行一个判断
let res = compose()("omg");
function compose(...funcs) {
if (funcs.length === 0) {
// return arg => arg;
// 或
return () => {};
}
if (funcs.length === 1) {
return funcs[0];
}
return funcs.reduce((a, b) => (...args) => a(b(...args)));
}