JavaScript组合函数

50 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

题外话

又是被通知继续居家一周的一天,疫情让我的厨艺大涨啊学习时间也更多了啦啦啦~回归正题

前情回顾

上几篇中我们一次介绍了

JavaScript纯函数

JavaScript柯里化2

JavaScript柯里化3

如何实现通用柯里化函数

今天我们再来认识一种函数————组合函数

组合函数

假设我们要将count这个数据进行如下操作,首先对count进行加1,之后对加1后的值进行平方,返回平方后的数值。

function sum(count) {
  return count += 1
}

function square(count) {
  return count *= count
}

let count = 1
var result = square(sum(count))
console.log(result);  //4

如果我们需要对某一个数据进行函数调用,执行两个函数fn1fn2。如果我们每次都需要一次调用这两个函数,就可以将这两个函数组合起来,自动依次调用,这个过程我们称之为组合函数

使用组合函数之后

function composeFn(fn1, fn2) {
  return function(count){
    return fn2(fn1(count))
  }
}

let fnResult = composeFn(sum, square)
var result = fnResult(count)
console.log(result);  //4

那我们如果存在10个以上的函数组合进行组合调用呢?我们这样以嵌套多层的方法调用返回结果就显得有点臃肿了,我们也可以像函数柯里化一样,封装一个通用的组合函数。

封装通用组合函数

假如这里我们就只有sumsquare这个两个函数需要组合调用

fucntion sum (count) {
 reutrn count += 1
}

fucntion square (count) {
    return count *= 2
}

我们开始封装一个通用的组合函数composeFn

function composeFn (...fn) {
   return function () {}
}

同样的,我们需要将组合完毕之后的函数返回出去,并且由于需要组合函数数量不固定,我们采用枯燥和你运算符来接收函数作为参数的传递。

function composeFn (...fn) {
    fn.map(item => {
        if (typeof item !== "function ") {
            throw new TypeError("Expected argment are Function")
        }
    })
    return function () {}
}

我们首先需要对传入的参数进行一个边界判断,既然是组合函数,那么传入的参数就必须都是函数类型。

function composeFn (...fns) {
    fn.map(item => {
        if (typeof item !== "function ") {
            throw new TypeError("Expected argment are Function")
        }
    })
    return function (...args) {
        let index = 0
        let result = fns.length ? fns[index].call(this, ...args) : args
        while (++index < fns.length) {
            result = fns[index].call(this, result)
        }
        return result
    }
}

我们同样采用扩展运算符来接收传入函数需要传入的参数,也就是上文中的count,之后我们定义一个参数result来返回最后的结果。因为是需要函数一个一个的执行上一次执行的结果,我们就可以采用循环迭代的方式来处理这些函数,并且将this绑定到函数上面。

结尾

关于组合函数,我们就介绍到这里啦,有疑问或者有写的错误的地方,希望大家在评论区帮忙指出哦~

预告

下一篇我打算补充一些关于JavaScript的知识点,欢迎来看呀