compose 函数实现原理

前端 · 2019-12-20 ·

compose 音译
v. 组成,构成(一个整体)

创建一个compose函数,返回函数集 functions 组合后的复合函数
1.后一个函数作为前一个函数的参数
2.最后一个函数可以接受多个参数,前面的函数只能接受单个参数;后一个的返回值传给前一个
3.compose内的函数执行顺序为从右向左,即最右边的函数(最后一个参数)最先执行,执行完的结果作为参数传递给前一个函数(包裹它的函数),一直到整个函数执行完毕,return一个函数

代码实现,当然实现这个函数的方法有很多

step1:简单实现方法

function compose(...fns) {
  const len = fns.length; // 记录我们传入所有函数的个数
  let index = len - 1; // 游标记录函数执行情况, 也作为我们运行fns中的中函数的索引
  let reslut; // 返回结果, 每次函数执行完成后, 向下传递
  const fun = (...arg) => {
    reslut = fns[index](...arg) //当然也可以写成 reslut = fns[index].apply('null',arg)
    if (index == 0) {
      index = len - 1
      return reslut
    } else {
      --index
      return fun(reslut)
    }
  }
  return fun
};

step2: 测试使用该方法

const a = (x,y,z) => x + y +z,
    b = x => x * x,
    c = x => x === 0 ? x : x*x;
console.log(compose(c,b,a)(1,2,3));
// 1296
%