源码阅读-学习redux的compose

redux中的compose

先上源码:

// 将(fun1,fun2,fun3)转换成fun1(fun2(fun3()))
export default function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }
  // 重点理解的一句 这里的reduce内部还返回了一个函数
  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}

重点看一句就够了:return funcs.reduce((a, b) => (...args) => a(b(...args)))

现在我们先假设一个数组,有3个函数,分别是x,y,z

那么compose([x,y,z])发生什么了,接下来就一步一步解释

  1. 变成reduce模式:[x,y,z].reduce((a, b) => (...args) => a(b(...args)))
  2. reduce第一次执行,a为x,b为y,reduce内部返回(...args)=>x(y(...args))
  3. reduce第二次执行,因为会将上一次的返回值作为a,这次b为z,因此将z(...args)套进a的参数,变成:(...args)=>x(y(z(...args)))
  4. 执行结束,最后compose就返回了这么个东西(...args)=>x(y(z(...args)))

因此,如果外部调用是这样的compose(...)(一些参数),那么这里的参数将会套进上面返回值的(...args),最终变成x(y(z(一些参数)))

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,314评论 19 139
  • 内置方法 abs:求绝对值 all:相当于且 any:相当于或 ascii repr() repr方法 repr方...
    Luo_Luo阅读 2,985评论 0 1
  • 三天前,沿路还是荒荒凉凉,光秃秃的一片,短短几天,便是桃红柳绿樱花开。菊矢看着窗外匆匆的一切,在夕阳下突然就有些感...
    咚塔塔族族人阅读 1,209评论 0 0
  • 2018.5.20 今天是我爱你的日子了,其实,明天都是的哦!爱着一个人并且被一个人爱着,真的是很幸福哦! 我的脾...
    烟花肆意O阅读 1,540评论 0 0