闭包应用---compose函数

138 阅读1分钟

函数组合

把处理的数据的函数像管道一样连接起来,然后让数据穿过管道最终得到最终结果

const add1=(x)=>x+1;
const mul3=(x)=>x*3;
const div2=(x)=>x/2;
div2(mul3(add1(add(0))) //3;

这样的写法可读性太差,我们可以构建一个compose函数,它接受任意多个函数作为参数(这些函数只接受一个参数),然后compose返回也是一个函数,达到以下效果:

const operate=compose(div2,mul3,add1,add1)
operate(0)//相当于div2(mul3(add1(add1(0))))

简而言之:compose可以吧类似于f(g(h(x)))这种写法简化成compose(f,g,h)(x)这种类型

实现如下

const add1=(x)=>x+1;
const mul3=(x)=>x*3;
const div2=(x)=>x/2;
//funcs:按照管道顺序依次存储要处理的函数
const compose=(...funcs)=>{
	return x=>{
		if(funcs.length===0){
			return x;		
		}
		if(funcs.length===1){
			return func[0](x)
		}
		return func.reduceRight((result,item)=>	{
			return item(result)
		},x)
	}
}
const operate=compose(div2,mul3,add1,add1);
console.log(operate(0));//3
console.log(operate()(10));//10
console.log(operate(div2)(10));//5