function compose(...funcs){
if(funcs.length == 0)
return ()=>{};
if(funcs.length == 1)
return funcs[0];
/*return funcs.reduce((a,b)=>{
return (...args)=>{
return a(b(...args));
};
})*/
const last = funcs[funcs.length-1];
const rest = funcs.slice(0, -1);
return (...args)=>rest.reduceRight((composed,next)=>next(composed), last(...args))
}
function greeting(s){
return s = 'hello,'+s;
}
function upper(s){
return s.toUpperCase();
}
console.log(compose(upper,greeting)('yanglang'))
reduce 从左到右 但是必须倒序执行。。。所以,
先reduce进行迭代,最后返回一个方法给外部调用作为入口
reduce迭代的话,获得参数的顺序肯定是从左往右的,于是a - b - c ... - e
return (...args)=>a(b(...args))
返回a(b(c(d(e(arguments)))))
reduceRight 从右到左 已经是倒序执行了,所以直接返回一个方法给外部调用
return (...args)=>{ reduceRight() }
...args已经是第二次调用传入的参数了,也就是'yanglang'
所以必须先把最后一个last函数给执行了
last(...args)
返回值作为 reduceRight的初始值放入,在回调里取倒数第二个函数传入并执行