JavaScript之高階函數(shù)

高階函數(shù)英文叫Higher-order function峦睡。那么什么是高階函數(shù)蔫骂?
在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中,高階函數(shù)是至少滿足下列一個(gè)條件的函數(shù):

  • 接受一個(gè)或多個(gè)函數(shù)作為輸入
  • 輸出一個(gè)函數(shù)

高階函數(shù)之把函數(shù)當(dāng)做參數(shù)

JavaScript的函數(shù)其實(shí)都指向某個(gè)變量。既然變量可以指向函數(shù)裸卫,函數(shù)的參數(shù)能接收變量彬祖,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù)茁瘦,這種函數(shù)就稱之為高階函數(shù)。

一個(gè)最簡單的高階函數(shù):

function  sum (x, y, f){
   return f(x) + f(y)
}

當(dāng)我們調(diào)用sum(-2储笑,6, Math.abs)時(shí)甜熔,參數(shù)x,y和f分別接收-2突倍,6和函數(shù)Math.abs(求絕對值)腔稀,根據(jù)函數(shù)定義盆昙,我們可以推導(dǎo)計(jì)算過程為:

x = -2;y =6;f = Math.abs;f(x) + f(y) ==> Math.abs(-2) + Math.abs(6) ==>2+6 ;return 8

用代碼驗(yàn)證一下:

sum(-2,6,Math.abs);//8

再舉一個(gè)大家都熟悉的例子,Array.prototype.sort方法焊虏,接受一個(gè)函數(shù)當(dāng)作參數(shù)淡喜,函數(shù)里面封裝的是對數(shù)組進(jìn)行排序的規(guī)則。

var arr = [1, 3, 5, 7, 2, 4, 6]; 
arr.sort(function(a, b) { 
     return a - b; //從小到大排序诵闭,如需從大到小排序炼团,只需return b - a;
 });

編寫高階函數(shù),就是讓函數(shù)的參數(shù)能夠接收別的函數(shù)疏尿。還有常見的事件綁定回調(diào)函數(shù)瘟芝,ajax回調(diào)函數(shù)等都屬于高階函數(shù)。

高階函數(shù)之返回值輸出

在JavaScript中褥琐,函數(shù)是第一類對象锌俱,其既可以作為參數(shù)傳遞,也可以作為其他函數(shù)的返回值輸出敌呈。

高階函數(shù)還可作為一種模式的構(gòu)造器贸宏,比如有若干排序算法(快排,冒泡驱富,希爾等)锚赤,就可以生成一個(gè)排序器。

//排序器
var sortGenerator = function(sortFunc){
return function(args){       
 var arguments = [].slice.call(args);
     return sortFunc(arguments);    
}};
//引入快速排序算法
var quickSort = require('quickSort.js');
var quickSorter = sortingGenerator(quickSort);
//應(yīng)用算法
quickSorter (4, 22, 44, 66, 77);

也許你會有疑惑我直接應(yīng)用require進(jìn)來的 quickSort() 就不行了褐鸥。干嘛多此一舉线脚?多包裝一層就可以干更多額外的事。比如測試每個(gè)排序算法的耗時(shí)叫榕。

再舉個(gè)ajax封裝的列子浑侥,我們寫好了一個(gè)簡單ajax請求服務(wù)器數(shù)據(jù)的功能,接受兩個(gè)參數(shù)method和callback晰绎。請求類型和回調(diào)寓落。每次都傳入請求類型很麻煩。那么我們生成兩個(gè)新的函數(shù)一個(gè)ajaxGet一個(gè)ajaxPost荞下。

var ajaxGenerator=function(method){
          return function( callback ){
              ajax( method, '/url',  callback  )
         }
}
var ajaxGet=ajaxGenerator('get')
    ajaxGet(mycallback )

var ajaxPost=ajaxGenerator('post')
    ajaxPost(mycallback  )

以上像不像函數(shù)的柯里化伶选,是的它屬于高階函數(shù)的降階。

偏函數(shù)
什么是偏函數(shù)
假設(shè)有一個(gè)參數(shù)或變量已經(jīng)預(yù)置的函數(shù)A尖昏,我們通過調(diào)用A來產(chǎn)生一個(gè)新的函數(shù)B仰税,函數(shù)B就是我們說的偏函數(shù)。下面可以看一個(gè)示例抽诉。
// 判斷類型的小demo

var isType = function(type){
return function(obj){
return toString.call(obj)=='[object '+type+']';
}
};

// 定制新的函數(shù)

var isString = isType('String');
var isArray = isType('Array');
var isFunction = isType('Function');

// 測試偏函數(shù)

console.log(isString('abc')); // true
console.log(isArray([1, 2])); // true
console.log(isFunction('abc')); // false

isType函數(shù)中預(yù)置了判斷類型的方法陨簇,只指定部分參數(shù)來產(chǎn)生的新的定制的函數(shù)isString、isArray和isFunction就是偏函數(shù)迹淌。
其實(shí)jquery的ajax, $.get和$.post等 也是類似原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末河绽,一起剝皮案震驚了整個(gè)濱河市己单,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耙饰,老刑警劉巖纹笼,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苟跪,居然都是意外死亡允乐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門削咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠢笋,你說我怎么就攤上這事拨齐。” “怎么了昨寞?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵瞻惋,是天一觀的道長。 經(jīng)常有香客問我援岩,道長歼狼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任享怀,我火速辦了婚禮羽峰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘添瓷。我一直安慰自己梅屉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布鳞贷。 她就那樣靜靜地躺著坯汤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搀愧。 梳的紋絲不亂的頭發(fā)上惰聂,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音咱筛,去河邊找鬼搓幌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛眷蚓,可吹牛的內(nèi)容都是我干的鼻种。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沙热,長吁一口氣:“原來是場噩夢啊……” “哼叉钥!你這毒婦竟也來了罢缸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤投队,失蹤者是張志新(化名)和其女友劉穎枫疆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敷鸦,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡息楔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扒披。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片值依。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碟案,靈堂內(nèi)的尸體忽然破棺而出愿险,到底是詐尸還是另有隱情,我是刑警寧澤价说,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布辆亏,位于F島的核電站,受9級特大地震影響鳖目,放射性物質(zhì)發(fā)生泄漏扮叨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一领迈、第九天 我趴在偏房一處隱蔽的房頂上張望彻磁。 院中可真熱鬧,春花似錦狸捅、人聲如沸兵迅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恍箭。三九已至,卻和暖如春瞧省,著一層夾襖步出監(jiān)牢的瞬間扯夭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工鞍匾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留交洗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓橡淑,卻偏偏與公主長得像构拳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容