(1)实现的代码如下:
<script>
const add1=x=>x+1;
const mul3=x=>x*3;
const div2=x=>x/2;
function compose(...funcs){
return function operate(x){
if(funcs.length===0) return x;
if(funcs.length===1) return funcs[0](x);
funcs.reverse();
let first=funcs[0](x);
funcs=funcs.slice(1);
return funcs.reduce(function(result,item){
return item(result);
},first)
}
}
let operate=compose(div2,mul3,add1,add1);
console.log(operate(0)); //3
operate=compose();
console.log(operate(0)); //0
operate=compose(add1);
console.log(operate(0)); //1
</script>
(2)或者compose函数如下所示:
function compose(...funcs){
return function operate(x){
if(funcs.length===0) return x;
if(funcs.length===1) return funcs[0](x);
funcs.reverse();
let n=0;
return funcs.reduce(function(result,item){
if((++n)==1){
return item(result(x));
}
return item(result);
})
}
}
(3)redux源码中的处理方案:
function compose(...funcs){
if (funcs.length===0){
return arg=>{
return arg;
};
}
if (funcs.length===1){
return funcs[0];
}
return funcs.reduce((a,b)=>{
return (...args)=>{
return a(b(...args));
}
})
}
let operate=compose(div2,mul3,add1,add1);
console.log(operate(0)); //3
operate=compose();
console.log(operate(0)); //0
operate=compose(add1);
console.log(operate(0)); //1