compose 函数就是将几个有特点的函数拼凑在一起, 让它们结合, 产生一个崭新的函数。
作用:可以把一个函数的运行结果当作实参传给下一个函数,即实现层级嵌套的函数调用扁平化。
比如有这样的需求,要输入一个名字,这个名字由 firstName
, lastName
组合而成,然后把这个名字全部变成大写输出来,比如输入 sea
,xiao,
我们就要打印出来,‘HELLO, SEA XIAO’
。我们考虑用函数组合的方法来解决这个问题,需要两个函数 greeting
, toUpper
var greeting = (firstName, lastName) => 'hello, ' + firstName + ' ' + lastName; var toUpper = str => str.toUpperCase(); var fn = compose(toUpper, greeting); console.log(fn('sea', 'xiao'));
这个简单版的 compose 就可以解决
const compose = (fn2,fn1) => (firstName,lastName)=> fn2(fn1(firstName,lastName))
如果还想再加一个处理函数,不需要修改 fn
,只需要在执行一个 compose
,比如我们再想加一个 toLower,只需要这样做
var toLower = str => str.toLowerCase(); var newFn = compose(trim, fn) console.log(newFn('sea', 'xiao'))
但是如果我们想一次性传入两个及以上的参数,这个简版的 compose 就不能满足要求,以下就是修改版的 compose:
function compose(...funcs) {
// 传递的函数集合
return function (...args) {
let length = funcs.length;
if (length == 0) {
//=>一个函数都不需要执行,直接返回ARGS
return args;
}
if (length == 1) {
//=>只需要执行一个函数,把函数执行,把其结果返回即可
return funcs[0](...args)
}
return funcs.reduce((x,y)=> typeof x === "function" ? x(y(...args)) : y(...args))
}
}
reduce 递归在 compose 中相当重要