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)    收藏  举报

导航