如何理解这个高阶函数?
该高阶函数会把多个函数合成一个大函数,该如何理解合成过程?
const compose = (...fns)=>
(arg)=>
fns.reduce(
(composed,f)=>f(composed),
arg
)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
转自文章:https://juejin.im/post/5e3ff9...
compose函数
compose函数可以将需要嵌套执行的函数平铺,嵌套执行就是一个函数的返回值将作为另一个函数的参数。我们考虑一个简单的需求:
这个需求很简单,直接一个计算函数就行:
但是根据我们之前讲的函数式编程,我们可以将复杂的几个步骤拆成几个简单的可复用的简单步骤,于是我们拆出了一个加法函数和一个乘法函数:
上面的计算方法就是函数的嵌套执行,而我们
compose
的作用就是将嵌套执行的方法作为参数平铺,嵌套执行的时候,里面的方法也就是右边的方法最开始执行,然后往左边返回,我们的compose
方法也是从右边的参数开始执行,所以我们的目标就很明确了,我们需要一个像这样的compose
方法:在讲这个之前我们先来看一个需要用到的函数
Array.prototype.reduce
Array.prototype.reduce
数组的reduce方法可以实现一个累加效果,它接收两个参数,第一个是一个累加器方法,第二个是初始化值。累加器接收四个参数,第一个是上次的计算值,第二个是数组的当前值,主要用的就是这两个参数,后面两个参数不常用,他们是当前index和当前迭代的数组:
Array.prototype.reduceRight
Array.prototype.reduce
会从左往右进行迭代,如果需要从右往左迭代,用Array.prototype.reduceRight
就好了那这个compose方法要怎么实现呢,这里需要借助
Array.prototype.reduceRight
:上面的
compose
函数使用ES6的话会更加简洁:Redux的中间件就是用
compose
实现的,webpack中loader的加载顺序也是从右往左,这是因为他也是compose
实现的。这种更好理解一点
外层方法接受一个function数组,返回一个内层方法
内层方法接受一个参数,按顺序调用外层方法参数的数组,以前一个方法的结果作为后一个方法的输入参数,最后返回结果