一:使用compose函数简化写法
function compose() {
for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
funcs[_key] = arguments[_key];
}
if (funcs.length === 0) {
return function(arg) {
return arg;
};
}
if (funcs.length === 1) {
return funcs[0];
}
return funcs.reduce(function(a, b) {
console.log(a,b)
return function() {
return a(b.apply(undefined, arguments));
};
});
}
function func1(num) {
console.log('func1 获得参数 ' + num);
return num + 1;
}
function func2(num) {
console.log('func2 获得参数 ' + num);
return num + 2;
}
function func3(num) {
console.log('func3 获得参数 ' + num);
return num + 3;
}
var re1 = func3(func2(func1(0)));
console.log('re1:' + re1);
var re2 = compose(func3, func2, func1)(0);
console.log('re2:' + re2);
复制代码
二:使用compose函数生成闭包,实现中间件功能
function compose() {
for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
funcs[_key] = arguments[_key];
}
if (funcs.length === 0) {
return function(arg) {
return arg;
};
}
if (funcs.length === 1) {
return funcs[0];
}
return funcs.reduce(function(a, b) {
console.log(a,'----',b)
console.log('------')
return function() {
return a(b.apply(undefined, arguments));
};
});
}
let say = function(){
console.log(0000)
}
function func1(func) {
return function(){
console.log(1111)
func()
console.log(1111)
}
}
function func2(func) {
return function(){
console.log(2222)
func()
console.log(2222)
}
}
function func3(func) {
return function(){
console.log(3333)
func()
console.log(3333)
}
}
// var re1 = func3(func2(func1(0)));
// console.log('re1:' + re1);
var strongSay = compose(func3, func2, func1)(say);
strongSay()
复制代码
实际上就是做了这么一件事: func1,func2,func3都接收func这个形参,而func这个参数由于会被使用,所以会一直以闭包的形式保存在内存中,也就是说func1,func2,func3会一直存在在内存中,func1接收到的是say,func2接收到的是func1,func3接收到的是func2。