《JS权威指南学习总结--8.8.2高阶函数》

内容要点:

     所谓高阶函数(higher-order function)就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新函数。

     例1:

       //这个高阶函数返回一个新的函数,这个新函数将它的实参传入f(),并返回f的返回值的逻辑非

        function not(f){

          return function(){   //返回一个新的函数

          var result = f.apply(this,arguments); //调用f()

          return !result;      //对结果求反

           };

        }

      var even = function(x){ //判断a是否为偶数的函数

            return x%2 ===0;

     };

     var odd = not(even); //一个新函数,所做的事情和even()相反

     [1,1,3,5,5].every(odd); //=>true:每个元素都是奇数

     代码分析:

          上面的not()函数就是一个高阶函数,因为它接收一个函数作为参数,并返回一个新函数。

     例2:

       mapper()函数,它也是接收一个函数作为参数,并返回一个新函数,这个新函数将一个数组映射到另一个使用这个函数的数组上。这个函数使用了之前定义的map()函数,但要首先理解这两个函数的不同:

        //所返回的函数的参数应当是一个实参数组,并对每个数组元素执行函数f(),并返回所有计算结果组成的数组,可以对比一下这个函数和上文提到的map()函数。

        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:

       接收两个函数f()和g(),并返回一个新的函数用以计算f(g()):

       //返回一个新的可以计算f(g(...))的函数

       //返回的函数h()将它所有的实参传入g(),然后将g()的返回值传入f()

      //调用f()和g()时的this值和调用h()时的this值是同一个this

       function compose(f,g){

           return function(){

              //需要给f()传入一个参数,所以使用f()的call()方法

              //需要给g()传入很多参数,所以使用g()的apply()方法

              return f.call(this,g.apply(this,arguments));

            };

        }

        var square = function(x){ return x*x;};

        var sum = function(x,y){ return x+y;};

        var squareofsum = compose(square,sum);

       squareofsum(2,3) //=>25

posted @ 2016-09-01 21:13  承载梦想-韩旭明  阅读(201)  评论(0编辑  收藏  举报