js 函数式编程学习笔记
(1)平常写的函数大多是接受值,合并值,返回值,比如经常写的for循环:
functionprintArray(array){ for(vari=0;i但是如果我们想做print之外的事情呢?怎么办?再写一个相似的,未免显得浪费,我们可以这样
functionforEach(array,action){ for(vari=0;i通过利用匿名函数,在编写for循环之类的可以省去很多无用的细节:
functionsum(numbers){ vartotal=0; forEach(numbers,function(number){ total+=number; }) returntotal; }上面的例子中是“遍历数组”,并使其抽象化,函数作为函数参数传入....
(2)另一种是传入函数参数,返回函数,可以在“高阶函数”中传入arguments
functionnegate(func){ returnfunction(x){ return!func(x); } } varisNotNaN=negate(isNaN); isNotNaN(NaN);如果想要反转的函数接受参数大于1个,怎么办??很简单,借助apply方法,上下文传入NULL
传说中的组合模式: functioncompose(f1,f2){ returnfunction(){ returnf1(f2.apply(null,arguments)); }; } varisNotNaN=compose(op["!"],isNaN); isNotNaN(5);=>true间接函数调用,如果运行次数较多还是不要用的好..
(3)sum函数实际上是算法的一个变体,该算法通常称为规约
functionreduce(combine,base,array){ forEach(array,function(element){ base=combine(base,element); }); } functionadd(a,b){ returna+b; } reduce(add,0,array);(4)另外一个与数组相关的有用的基本算法称为“映射”。它能够遍历数组
functionmap(func,array){ varresult=[]; forEach(array,function(element){ result.push(func(element)); }); returnresult; } map(Math.round,[0.01,2,9,Math.PI]);(5)下面这段代码,可以研究下它的工作原理
functionsplitParagraph(text){ functionsplit(pos){ if(pos==text.length)return[]; elseif(text.charAt(pos)=="*"){ varend=findClosing(“*”,pos+1); frag={type:“emphasized”,content:text.slice(pos+1,end)}; return[frag].concat(split(end+1));//回调 }elseif(text.charAt(pos)=="{"){ varend=findClosing(“{”,pos+1); frag={type:“emphasized”,content:text.slice(pos+1,end)}; return[frag].concat(split(end+1));//回调 }else{ varend=findOpeningOrEnd(pos), frag={type:"normal",content:text.splice(pos+1,end)}; return[frag].concat(split(end)); } } functionfindClosing(character,from){ varend=text.indexOf(character,from); if(end==-1)thrownewError("Missingclosing'"+character+"'"); returnend; } functionfindOpeningOrEnd(from){ functionindexOrEnd(character){ varindex=text.indexOf(character,from); returnindex=-1?text.length:index; } returnMath.min(indexOrEnd("*"),indexOrEnd("{")); } returnsplit(0); }这种函数的编程风格很独特,使用递归而不是循环,其实递归效率是比较低的,改进如下:
functionsplit(){ varpos=0,fragments=[]; while(pop(6)分布应用模式
functionpartial(func){ varknownArgs=arguments; returnfunction(){ varrealArgs=[]; for(vari=1;i