持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
题外话
又是被通知继续居家一周的一天,疫情让我的厨艺大涨啊学习时间也更多了啦啦啦~回归正题
前情回顾
上几篇中我们一次介绍了
今天我们再来认识一种函数————组合函数
组合函数
假设我们要将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
如果我们需要对某一个数据进行函数调用,执行两个函数
fn1
和fn2
。如果我们每次都需要一次调用这两个函数,就可以将这两个函数组合起来,自动依次调用,这个过程我们称之为组合函数。
使用组合函数之后
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
个以上的函数组合进行组合调用呢?我们这样以嵌套多层的方法调用返回结果就显得有点臃肿了,我们也可以像函数柯里化一样,封装一个通用的组合函数。
封装通用组合函数
假如这里我们就只有sum
和square
这个两个函数需要组合调用
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
的知识点,欢迎来看呀