博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
compose函数
阅读量:6682 次
发布时间:2019-06-25

本文共 1519 字,大约阅读时间需要 5 分钟。

compose函数

在学习redux源码的时候看到了其中的工具函数composecompose函数的作用就是组合函数,依次组合传入的函数:

  1. 后一个函数作为前一个函数的参数
  2. 最后一个函数可以接受多个参数,前面的函数只能接受单个参数;后一个的返回值传给前一个

reduce实现

redux中是使用reduce实现的

function compose(...funcs) {  //没有传入函数参数,就返回一个默认函数(直接返回参数)  if (funcs.length === 0) {    return arg => arg  }  if (funcs.length === 1) {  // 单元素数组时调用reduce,会直接返回该元素,不会执行callback;所以这里手动执行    return funcs[0]  }  // 依次拼凑执行函数  return funcs.reduce((a, b) => (...args) => a(b(...args)))}

reduce的详细说明可以查阅。

举例分析:compose(f4,f3,f2,f1)(c,d,e)

  • reduce回调函数第一次执行时,返回值为 函数 (...args) => f4(f3(...args)),作为下一次执行的a参数
  • 回调函数第二次执行时,返回值为 函数(...args) => f4(f3(f2(...args))),作为下一次执行的a参数
  • 回调函数第三次执行时,返回值为 函数(...args) => f4(f3(f2(f1(...args))))

最右边的参数f1可以接受多个参数,然后返回结果传给下一个函数f2,返回结果再传入f3··· f3最先被调用,会等待f2的结果,再等待f1的结果。

let a = (x,y) => x + y,        b = x => x * x,        c = x => x === 0 ? x : 1/x;        compose(c,b,a)(1,2); // 1/9

那么如果想从左到右返回结果呢?

  1. 使用reduceRight
  2. funcs倒序

迭代实现

用迭代的方式实现从右到左依次执行的组合函数。

function compose(...funcs) {        let length = funcs.length;        return function(...arg) {            let index = length - 1,                result = length > 0 ? funcs[index].apply(this,arg) : arg; //注意arg为数组,要用apply            while(--index >=0 ) {                result = funcs[index].call(this,result);            }            return result;        }    }

通过index来标记应该执行哪个函数,这里是从最右边(length - 1)开始执行的,每执行一个index就减1,直到index0(最左边)为止。

result来记录每次函数执行的返回值,每次都会更新,直到所有函数都执行完。才会返回最终结果
如果传递的函数列表为空,则返回传入参数。

同样的如果需要从左到右依次执行,则将funcs倒序即可。

转载于:https://www.cnblogs.com/shapeY/p/10693552.html

你可能感兴趣的文章
vs2010 mvc3
查看>>
RocketMQ 源码分析 高可用
查看>>
我的友情链接
查看>>
CentOS 7.5.1804 安装配置docker
查看>>
我的友情链接
查看>>
浏览器的缓存原理
查看>>
Swift::1::变量和常量
查看>>
SFB 项目经验-79-如何升级Exchange 2016 CU10高可用 To CU11
查看>>
写在毕业后快一月
查看>>
改变学习方法,今天完成第6课
查看>>
挖矿进程攻击的解决
查看>>
Android自适应屏幕大小和布局
查看>>
锁等待分析处理
查看>>
未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
查看>>
傻瓜式操作Nagios
查看>>
被神话了的ERP系统
查看>>
Spring task配置,及解决加载两次的方法
查看>>
仿淘宝套餐选择插件 基于jQuery(原创)
查看>>
毫秒转时分秒
查看>>
思科模拟器Packet Tracer的使用
查看>>