一:使用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。