函数组合
函数组合是指将多个函数按程序执行,前一个函数的返回值作为下一个函数的参数,最终返回后果。
这样做的益处是能够将简单工作宰割成多个子工作,而后通过组合函数再组合成简单工作。咱们要实现的就是这样的组合函数(compose 函数),理论就一个工具函数。
function fn1(num) { return num + 1 } function fn2(num) { return num + 2 } function fn3(num) { return num + 3 } // 咱们须要实现这样一个组合函数,承受参数为须要组合的子函数,最初返回组合后的函数。 function compose(fn1,fn2,fn3) { return function() { // ... } } // 最终目标使 compose(fn3,fn2,fn1)(5) === fn3(fn2(fn1(5)))
实现一个compose函数
一般办法实现
function compose(...fns) { // reverse() 作用是使输出函数从右往左执行 fns = fns.reverse() return function(...args) { let res; fns.forEach((fn,index) => { if(index === 0) { res = fn.apply(this, args) } else { res = fn(res) } }) return res } }
reduce 实现
//第一个函数承受参数是一个的状况,实现办法 如 compose(fns)(1) function compose(...fns) { // reduceRight办法使输出函数从右往左执行,从左往右的话能够应用数组的reduce办法 return function(x) { return fns.reduceRight((accumulator, currentValue) => currentValue(accumulator), x) } } // 第一个函数承受参数个数不确定的状况,如compose(fns)(1,2,3...),实现办法 // 此时须要解构出第一个函数,并传入初始参数,因为第一个函数的参数非凡 function compose(...fns) { fns = fns.reverse() return function (...args) { // 此处用了es6 的数组的双重解构,取出第一个函数,和剩下的函数组成的数组 let [...[firstFn, ...restFn]] = fns if (!firstFn) return if (restFn.length === 0) { return firstFn.apply(this, args) } else { let initValue = firstFn.apply(this,args) return restFn.reduceRight((accumulator, currentValue) => currentValue(accumulator), initValue) } } } console.log(fn3(fn2(fn1(1,2))) ==== compose(fn3,fn2,fn1)(1,2))
理论利用
前端中常常提到的中间件都是函数组合的利用。
redux 中间件
待续...
koa 中间件
待续...
参考
https://juejin.cn/post/684490...
最初
以上纯属自己集体学习总结,如有谬误欢送斧正,交换