在分析koa2源码之前,先来认识下复合函数,复合函数顾名思义就是把多个函数合并成一个函数,通俗来讲就是一个函数执行完后的结果作为下一个函数的参数来执行,也就是a(b(c(fn)))这种形式。
先来查看如下代码
function add(x, y) {
return x + y
}
function square(z) {
return z * z
}
function mult(a) {
return a *2
}
//先看一个只有固定参数的复合函数
function compose(f1, f2) {
//返回一个函数
return function(...args) {
return f1(f2(...args))
}
}
let comp= compose(square, add)
console.log(comp(2,4)) //36
上面就是一个简单的复合函数,现在我们把这个参数扩大到一个数组,这样我们的数组就是一个不固定的长度。
function composes(midle) {
return midle.reduce(function(leftFn, rightFn) {
return function(...args) {
return rightFn(leftFn(...args))
}
})
}
let middleWare = [add, square, abc];
let b = composes(middleWare)
console.log(b(1, 6)); //98
解析:
let middleWare = [add, square, abc];
let b = composes(middleWare)
这两行就是定义了一个数组,数组里面的每个元素就是函数的名,在执行composes(middleWare)时,我们首先要定义这是要返回一个函数。然后在利用数组的reduce方法进行叠加。
整体执行过程(可以把代码复制到console里面执行):
//leftFn
ƒ add(x, y) {
return x + y
}
//rightFn
ƒ square(z) {
return z * z
}
//leftFn
ƒ (...args) {
return rightFn(leftFn(...args))
}
//rightFn
ƒ abc(a) {
return a *2
}
ƒ (...args) {
return rightFn(leftFn(...args))
}
总结:要很好的理解复合函数的运行过程,对应以后理解高阶函数有很多的相似或通用的地方。