簡(jiǎn)析JavaScript中的函數(shù)式編程(一)

與Lisp谅猾,Haskell不同自沧,JavaScript并非函數(shù)式編程語言,但在JS之中可以像操控對(duì)象一樣操控函數(shù)廊酣,換句話說锉罐,可以在JS中應(yīng)用函數(shù)式編程技術(shù)帆竹。
什么是函數(shù)式編程?
?函數(shù)式編程通過使用函數(shù)來將值轉(zhuǎn)換成抽象單元脓规,接著用于構(gòu)建軟件系統(tǒng)栽连。
舉個(gè)很普通且低級(jí)的例子:假設(shè)有一個(gè)數(shù)組,數(shù)組元素都是數(shù)字侨舆,我們想要計(jì)算它的平均值和標(biāo)準(zhǔn)差秒紧,如果使用非函數(shù)式編程那么就是這個(gè)樣子:

var data = [1,2,3,4,5];
var total = 0;
for(var i = 0; i < data.length; i++)
  total += data[i];
var mean = total / data.length;  //平均數(shù)為3
total = 0;
for(var i = 0; i < data.length; i++) {
  var deviation = data[i] - mean;
  total += deviation * deviation;
}
var stddev = Math.sqrt(total / (data.length-1));  //標(biāo)準(zhǔn)差為2

采用函數(shù)式編程那么就是這個(gè)樣子(這里會(huì)用到數(shù)組方法map()和reduce(),ES3未包含這兩種方法,所以下面會(huì)先進(jìn)行判斷,如果有map()和reduce()就直接使用挨下,否則就自行定義):

var map = Array.prototype.map?function(a, f) { return a.map(f); }
 :function(a, f) {
    var results = [];
    for(var i = 0,len = a.length; i < len; i++) {
        if (i in a)  results[i] = f.call(null,a[i],i,a);
    }
    return results;
};
var reduce = Array.prototype.reduce?function(a,f,initial) {
  if(arguments.length > 2)
      return a.reduce(f, initial);
  else
      return a.reduce(f);
}
: function(a,f,initial) {
  var i = 0, len = a.length,accmulator;
  if(arguments, length > 2)  
      accmulator = initial;
  else{
    if(len == 0)
        throw TypeError();
    while( i < len){
        if(i in a){
          accumulator = a[i++];
          break;
        }
        else
            i++;
      }
      if(i == len) throw TypeError();
    }
    while( i < len) {
         if ( i in a)
              accumulator = f.call(undefined, accumulator,a[i],i,a);
         i++;
    }
    return accumulator;
});
//下面的代碼塊就是函數(shù)式編程
var sum = function(x,y) { return x+y; };
var square = function(x) { return x*x;};
var data = [1,2,3,4,5];
var mean = data.reduce(sum) / data.length;
var deviations = data.map(function(x) { return x-mean;});
var stddev = Math.sqrt(deviations.map(square).reduce(sum) / (data.length - 1));

用嚴(yán)格的函數(shù)式編程的方法來解決問題熔恢,會(huì)將一個(gè)問題分成幾部分(函數(shù))來解決。如下圖:

38AE6BDC-B547-4D22-A6F4-75352DFD4096.png

函數(shù)式編程通過“組合”其他函數(shù)的方式來構(gòu)建更大的函數(shù)臭笆,以實(shí)現(xiàn)更抽象的行為如下圖:

7F847FBE-FF80-4C90-A433-EA90A9AF32AE.png

最終叙淌,一種將函數(shù)的部件組成一個(gè)完整的系統(tǒng)的方法是取一個(gè)值秤掌,逐漸的將它“改變”——通過一個(gè)原始的或組合的函數(shù)——成為另外一個(gè)值。

95E3C3D8-1869-47FB-A031-2E5099D83608.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹰霍,一起剝皮案震驚了整個(gè)濱河市机杜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衅谷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件似将,死亡現(xiàn)場(chǎng)離奇詭異获黔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)在验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門玷氏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腋舌,你說我怎么就攤上這事盏触。” “怎么了块饺?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵赞辩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我授艰,道長(zhǎng)辨嗽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任淮腾,我火速辦了婚禮糟需,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谷朝。我一直安慰自己洲押,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布圆凰。 她就那樣靜靜地躺著杈帐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪送朱。 梳的紋絲不亂的頭發(fā)上娘荡,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音驶沼,去河邊找鬼炮沐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛回怜,可吹牛的內(nèi)容都是我干的大年。 我是一名探鬼主播换薄,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼翔试!你這毒婦竟也來了轻要?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤垦缅,失蹤者是張志新(化名)和其女友劉穎冲泥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壁涎,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凡恍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怔球。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚼酝。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖竟坛,靈堂內(nèi)的尸體忽然破棺而出闽巩,到底是詐尸還是另有隱情,我是刑警寧澤担汤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布涎跨,位于F島的核電站,受9級(jí)特大地震影響漫试,放射性物質(zhì)發(fā)生泄漏六敬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一驾荣、第九天 我趴在偏房一處隱蔽的房頂上張望外构。 院中可真熱鬧,春花似錦播掷、人聲如沸审编。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垒酬。三九已至,卻和暖如春件炉,著一層夾襖步出監(jiān)牢的瞬間勘究,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工斟冕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留口糕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓磕蛇,卻偏偏與公主長(zhǎng)得像景描,于是被迫代替她去往敵國(guó)和親十办。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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