varcompose=function(fun1,fun2){returnfunction(val){returnfun1(fun2(val));}}varadd=function(val){return val +"111";}varupperCase=function(val){return val.toUpperCase();}vardouble=function(val){return val += val;}// 无限组合,才是compose的威力所在var upperCaseThenAdd =compose(add,upperCase);var doubleThenAdd =compose(double,add);var addThenAdd =compose(add,add);var addThenAddThenUpperCase =compose(upperCase,addThenAdd);//注意这个函数,以组合函数addThenAdd作为其参数,很强大,有没有!
console.log(upperCaseThenAdd("china"));//CHINA111
console.log(doubleThenAdd("china"));//china111china111
console.log(addThenAdd("china"));//china111111
console.log(addThenAddThenUpperCase("china"));//CHINA111111//改进compose,支持2个以上参数varcompose1=function(){var args = arguments;returnfunction(initVal){var val = initVal;for(key in args){
val = args[key](val);}return val;}}var doubleThenUpperCaseThenAddThenAdd =compose1(double,upperCase,add,add);
console.log(doubleThenUpperCaseThenAddThenAdd("china"));//CHINACHINA111111
带条件判断的组合函数
给定一个数值,递归求和,同时要有前置条件,判断参数是否为整数,是否大于零(多条件)
functionisNum(n){returntypeof n ==="number";}functionmoreThenZero(n){return n >=0;}functionadd(n){if(n ===0){return0;}return n +add(--n);}functionevery(funArr, num){for(var i =0; i < funArr.length; i++){if(!funArr[i](num)){returnfalse;}}returntrue;}functioncompose(condition, fn){returnfunction(num){if(!condition instanceofArray){
condition =[condition];};returnevery(condition, num)?fn(num):null;}}var sum =compose([isNum, moreThenZero], add);
console.log(sum(10));//55