Skip to content

1、compose函数 ​

  是一种以函数作为输入参数的函数,且函数执行顺序是从右到左。调用后返回的还是一个函数,跟偏函数和柯里化函数有点像。具体实现过程如下。

javascript
//compose函数实现方式1
function compose(...funs){
    const len=funs.length;
    if(len===0) return x=>x;
    if(len===1) return funs[0];
    return function(args){
        let res=args;
        for(let i=fns.length;i--;){
            res=fns[i](res);
        }
        return res;
    }
}
//compose函数实现方式2
function compose(...funs){
    const len=funs.length;
    if(len===0) return x=>x;
    if(len===1) return funs[0];
    return funs.reduce((cur,next)=>{
        return (arg)=>cur(next(arg))
    })
}
// compose函数实现方式3
function compose(...funs){
    const len=funs.length;
    if(len===0) return x=>x;
    if(len===1) return funs[0];
    return (...arg)=>{
        //也可以 funs.reverse().reduce()
        return funs.reduceRight((cur,next)=>{
            return next(...cur);
        },arg)
    }
}
function add(x){
    return x+5;
};
function multyply(x){
    return x*5;
}
function minus(x){
    return x-5;
}
let fn1=compose(add,multyply,minus);
console.log(fn1(10));//30

2、pipe函数 ​

  是一种以函数作为输入参数的函数,且函数执行顺序是从左到右。

javascript
//pipe函数
function pipe(){
    const fns=[].slice.call(arguments);
    return function(args){
        let res=ars;
        for(let i=0;i<fns.length;i++){
            res=fns[i](res);
        }
        return res;
    }
}
//pipe函数实现方式2
function pipe(...funs){
    const len=funs.length;
    if(len===0) return x=>x;
    if(len===1) return funs[0];
    return funs.reduce((cur,next)=>{
        return (arg)=>next(cur(arg))
    })
}
//实践
function add(x){
    return x+5;
};
function multyply(x){
    return x*5;
}
function minus(x){
    return x-5;
}
let fn1=compose(add,multyply,minus);
console.log(fn1(10));//30
let fn2=pipe(add,multyply,minus);
console.log(fn2(10));//70

记录 · 实践 · 分享