组合函数

63 阅读1分钟

组合(Compose)函数是在JavaScript开发过程中一种对函数的使用技巧、模式

  • 比如我们现在需要对某一个数据进行函数的调用,执行两个函数fn1和fn2,这两个函数是依次执行的;
  • 那么如果每次我们都需要进行两个函数的调用,操作上就会显得重复;
  • 那么是否可以将这两个函数组合起来,自动依次调用呢?
  • 这个过程就是对函数的组合,我们称之为 组合函数(Compose Function);
function double(num) {
  return num * 2
}

function square(num) {
  return num ** 2
}

var count = 10
var result = square(double(count))
console.log(result)

// 实现最简单的组合函数
function composeFn(m, n) {
  return function(count) {
    return n(m(count))
  }
}

var newFn = composeFn(double, square)
console.log(newFn(10))

通用的组合函数的实现

function hyCompose(...fns) {
  var length = fns.length
  for (var i = 0; i < length; i++) {
    if (typeof fns[i] !== 'function') {
      throw new TypeError("Expected arguments are functions") // 抛出类型异常
    }
  }

  function compose(...args) {
    var index = 0
    var result = length ? fns[index].apply(this, args): args // length指传入函数个数
    while(++index < length) {
      result = fns[index].call(this, result)
    }
    return result
  }
  return compose
}

function double(m) {
  return m * 2
}

function square(n) {
  return n ** 2
}

var newFn = hyCompose(double, square)
console.log(newFn(10))

// compose函数的工作原理:

// 1. 检查是否有函数存在(length是否非零)。

// 2. 如果有,第一个函数被调用,传入所有args参数。

// 3. 后续的每个函数都接收前一个函数的返回值作为唯一参数。

// 4. 最终的结果是所有函数依次调用的结果。