函數式編程基礎---高階函數和偏函數


一、高階函數

  所謂高階函數是指可一把函數作為參數,或者是可以將函數作為返回值的函數(我們見得閉包函數就是高階函數)。

function foo(x){
   return function(){
        return x;
   }  
}

  對於程序的編寫,高階函數比普通函數要靈活的多,除了通常意義的函數調用返回外,還形成了一種后續傳遞風格的結果接收方式,而非單一的返回值形式,后續傳遞風格的程序編寫將函數的業務重點從返回值轉移到了回調函數中:

function(x,bar){
   return bar(x);      
}

  以上的代碼為例,對於相同的foo()函數,傳入的bar的參數不同,則可以得到不同的結果。結合Node提供的最基本的事件模塊可以看到,事件的處理方式就是基於高階函數的特性來完成的。

  高階函數在JS中的應用比比皆是,其中ECMAScript5中提供的一些數組方法就是典型的高階函數,比如:forEach()、map()、reduce()、reduceRight()、filter()、every()、some()等。

 

二、偏函數

  偏函數用法是指創建一個調用另一個部分——參數或變量已經預置的的函數——的函數的用法。(好拗口,我也不懂),先看看例子。

普通方法:
var
toString=object.prototype.toString; var isString=function(obj){ return toString.call(obj)=='[object String]'; }; var isFunction=function(obj){ return toString.call(obj)=='[object Function]'; };
.......... 偏函數方法:
var isType=function(type){ return function(obj){ return tostring.call(obj)=='[object ' + type+ ' ]'; } }

  上面的例子中,用偏函數方法去除了冗余代碼,解決了重復定義的問題。這種通過指定部分參數來產生一個新制定的函數的形式就是偏函數。

  偏函數應用在異步編程中也十分常見,著名的類庫Underscore提供的after()方法既是偏函數應用,其定義如下:

_.after=function(times,func){
   if(times<=0) return func();
   return function(){
      if(--times<1){return func.apply(this,arguments)};
   }  
}

   這個函數可以根據傳入的times參數和具體的方法,生成一個需要調用多次才能真正執行實際函數的函數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM