# compose

compose函数是Redux中唯一能拿出来单独使用的API,是函数式编程中常用的合成函数,与Redux本身没有什么关系。

纯函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。

在compose.js中的源代码:

export default function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }

  if (funcs.length === 1) {
    return funcs[0]
  }

  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}

核心代码就最后一句funcs.reduce((a, b) => (...args) => a(b(...args)))

其主要作用为:

const sum = fn1(fn2(fn3(f4(10))));

// 将上面嵌套函数简化为如下:
const sum = compose(fn1, fn2, fn3, fn4)(10);

# 例子

import {compose} from 'redux'

const x = 10;
const fn1 = x => x + 1;
const fn2 = x => x + 2;
const fn3 = x => x + 3;
const fn4 = x => x + 4;

// 原生调用方式
const sum = fn1(fn2(fn3(fn4(x)))); // 10 + 4 + 3 + 2 + 1 = 20

// compose调用方式
const composeSum = compose(fn1, fn2, fn3, fn4)(x); // 10 + 4 + 3 + 2 + 1 = 20

执行过程表:

循环轮次 a值 b值 返回值
1 fn1 fn2 (...args) => fn1(fn2(...args))
2 (...args) => fn1(fn2(...args)) fn3 (...args) => fn1(fn2(fn3(...args)))
3 (...args) => fn1(fn2(fn3(...args))) fn4 (...args) => fn1(fn2(fn3(fn4(...args))))

最后返回了一个嵌套函数:fn1(fn2(fn3(fn4(x))))

最近更新时间: 2020/9/6 11:30:38