ccompose组合函数:把多层函数嵌套调用扁平化。
重点:常基于reduce, 柯里化函数思想解决函数调用扁平化的问题。
函数嵌套:B函数依赖A函数的返回值, C函数依赖B函数的返回值,
就会导致调用的时候如下:
const fn1 = x => x+10;
const fn2 = x => x*10;
const fn3 = x => x/10;
console.log(fn3(fn2(fn1())));
函数调用扁平化: 如果是多层级嵌套调用的函数, 把一个函数调用完,当做另一个函数的实参算低到下一个函数中。
解决方案: 从左到右一次执行
function compose(...funcs){
return function anonymous(...args){
if(funcs.length === 0) {
return args;
}
if(funcs.length === 1) {
return funcs[0](...args);
}
return funcs.reduce((n, func)=>{
//第一次执行:n表示第一个函数执行的实参, func表示第一个函数
//第二次执行:n表示上一次func的执行返回值, 作为实参传递给下一个函数执行,func为下一个函数
return Array.isArray(n) ? func(...n) : func(n);
}, args);
}
}
let result = compose(fn1,fn2,fn3)(5);
//执行过程
console.log(compose()(5)) // =>5;
console.log(compose(fn1)(5)); //=>10+5;
console.log(compose(fn1, fn2)(5))// =>f1(5)=15 fn2(15)=150;
console.log(componse(fn1,fn2,fn3)(5));// =>f1(5)=15 fn2(15)=150 fn3(150)=>15;