javaScript 权威指南读书笔记(高阶函数)
高阶函数就是操作函数的函数,它接受一个或者多个函数做参数,并且返回一个新的函数。
eg
#1 not 函数返回一个函数的非
function not(f){ return function(){ var result=f.apply(this,arguments); return !result; } } function even(x){ return x%2==0; } console.log(not(even)(3)); console.log(not(even)(2));
#2 mapper函数,将一个数组映射到另一个数组中
var map=Array.prototype.map?function(a,f){return a.map(f)}:function(a,f){
var result=[];
for(var i=0;i<a.length;i++){
if(i in a) result[i]=f.call(undefined,a[i],i,a);
}
return result;
}
function mapper(f){ return function(a){ return map(a,f); } }
var increment=function(x){return x+1;}
var incrementer=mapper(increment);
incrementer([1,2,3]); //[2,3,4]
#3 compose 函数
function compose(f,g){ return function(){ return f.call(this,g.apply(undefined,arguments)); }; } function sum(x,y){return x+y} function square(x){return x*x} compose(square,sum)(1,3);//16
不完全函数
根据外层函数传入实参在实际调用函数参数列表的位置,分为左侧,右侧,填充undefined 三种情况
# 左侧
function array(a,n){ return Array.prototype.slice.call(a,n||0); } function partialLeft(f){ var arg=arguments; return function(){ var a=array(arg,1); a=a.concat(array(arguments)); return f.apply(this,a); } } function f(x,y,z){ return x*(y+z); } partialLeft(f,3)(2,1);//9
#右侧
function array(a,n){ return Array.prototype.slice.call(a,n||0); } function partialRight(f){ var arg=arguments; return function(){ var a=array(arg,1); a=array(arguments).concat(a); return f.apply(this,a); } } function f(x,y,z){ return x*(y+z); } partialLeft(f,3)(2,1);//8
#填充undefined
function array(a,n){ return Array.prototype.slice.call(a,n||0); } function partial(f){ var arg=arguments; return function(){ var a=array(arg,1); var i=0,j=0; while(i<a.length){ if(a[i]===undefined){ a[i]=arguments[j]; j++; } i++; } a=a.concat(array(arguments,j)); return f.apply(this,a); } } function f(x,y,z){ return x*(y+z); } partial(f,undefined,3)(2,1);//8
记忆
#memorize
function memorize(f){ var cache={}; return function(){ var key=arguments.length+Array.prototype.join.call(arguments,","); if(key in cache)return cache[key]; else return cache[key]=f.apply(this,arguments); } }
应用
function gcd(a,b){ var t; if(a<b)t=a,a=b,b=t; while(b!=0)t=b,b=a%b,a=t; return a; } var gcddemo=memorize(gcd); gcddemo(85,187);
posted on 2014-02-14 16:33 Young_Junior_Man 阅读(147) 评论(1) 收藏 举报
浙公网安备 33010602011771号