compose函数

555 阅读1分钟

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;