1、高階函數編程
所謂高階函數是指可一把函數做爲參數,或者是能夠將函數做爲返回值的函數(咱們見得閉包函數就是高階函數)。數組
function foo(x){ return function(){ return x; } }
對於程序的編寫,高階函數比普通函數要靈活的多,除了一般意義的函數調用返回外,還造成了一種後續傳遞風格的結果接收方式,而非單一的返回值形式,後續傳遞風格的程序編寫將函數的業務重點從返回值轉移到了回調函數中:閉包
function(x,bar){ return bar(x); }
以上的代碼爲例,對於相同的foo()函數,傳入的bar的參數不一樣,則能夠獲得不一樣的結果。結合Node提供的最基本的事件模塊能夠看到,事件的處理方式就是基於高階函數的特性來完成的。app
高階函數在JS中的應用比比皆是,其中ECMAScript5中提供的一些數組方法就是典型的高階函數,好比:forEach()、map()、reduce()、reduceRight()、filter()、every()、some()等。異步
2、偏函數異步編程
偏函數用法是指建立一個調用另外一個部分——參數或變量已經預置的的函數——的函數的用法。(好拗口,我也不懂),先看看例子。函數
普通方法:
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+ ' ]'; } }
上面的例子中,用偏函數方法去除了冗餘代碼,解決了重複定義的問題。這種經過指定部分參數來產生一個新制定的函數的形式就是偏函數。this
偏函數應用在異步編程中也十分常見,著名的類庫Underscore提供的after()方法既是偏函數應用,其定義以下:spa
_.after=function(times,func){ if(times<=0) return func(); return function(){ if(--times<1){return func.apply(this,arguments)}; } }
這個函數能夠根據傳入的times參數和具體的方法,生成一個須要調用屢次才能真正執行實際函數的函數。prototype