1、合成(compose) 如果一个值要经过多个函数,才能变成另外一个值,就可以把所有中间步骤合并成一个函数,叫做‘函数的合成’。 优点:把代码变得简单而富有可读性,同时通过不同的组合方式,我们可以轻易组合出其他常用函数,让我们的代码更具表现力。 将前一个函数的结果作为初始值带入下一个函数中,实现函数的扁平化。
function f1(arg){
console.log('f1',arg)
return arg
}
function f2(arg){
console.log('f2',arg)
return arg
}
function f3(arg){
console.log('f3',arg)
return arg
}
function compose(...funcs){
if(funcs.length === 0){
return arg => arg
}
if(funcs.length === 1){
return funcs[0]
}
return funcs.reduce((a,b) =>(...args) => a(b(...args)))
}
let res = compose(f1,f2,f3)('omg')
2、柯里化(curry) 把接收多个参数的函数变换成接收一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 就是把一个多参函数,转化为单参函数。 作为一个高阶函数的两个条件: 参数是个函数 返回的也是个函数
// 实现一个柯里化求和函数
function add(x,y){
return x+y
}
function curry(fn){
const fn1 = (...args) => {
// 函数的个数相同
if(args.length === fn.length)
return fn(...args)
// 有多个函数
return (...arg) => fn1(...args, ...arg)
}
return fn1
}
console.log(curry(add)(2)(5)) //7