函數(shù)式編程

JavaScript函數(shù)式編程

函數(shù)式編程的基礎是一等函數(shù)(函數(shù)在js中作為一等公民)滋恬、作用域(詞法作用域,動態(tài)作用域)和閉包檬寂。
函數(shù)式編程的第一個概念是高等函數(shù):高等函數(shù)將函數(shù)作為參數(shù)宪潮,或者將函數(shù)作為返回值告匠。
高等函數(shù)是函數(shù)式編程的基礎,幾乎隨處可見高等函數(shù)著隆。

由函數(shù)構(gòu)建函數(shù)

首先討論函數(shù)的構(gòu)建扰楼。函數(shù)式編程通過高等函數(shù)和一等函數(shù)構(gòu)建,常用的方法有三種

柯里化

柯里化為每一個邏輯參數(shù)返回一個新函數(shù)美浦,分為手動柯里化和自動柯里化弦赖。

手動柯里化

自己手寫函數(shù)的柯里化版本,有柯里化方向的選擇(向左還是向右)

function div(n ,d) {
  return n / d;
}

function leftCurry(n) {
  return function (d) {
    return n / d;
  }
}

function rightCurry(d) {
  return function (n) {
    return n / d;
  }
}

但這樣很麻煩浦辨,每個函數(shù)都要提供一個柯里化版本

自動柯里化

指我們通過一個curry函數(shù)生成一個普通函數(shù)的柯里化版本

比如我們可以寫這樣一個curry2函數(shù)做到手動柯里化中的那種效果

function curry2(func) {
  return function (first) {
    return function (second) {
      return func(first, second);
    };
  };  
}

function div(n, d) {
  return n / d;
}

var leftCurry = curry(div);

這樣實現(xiàn)的一個leftCurry跟手動柯里化實現(xiàn)的是一模一樣的蹬竖;但是自動柯里化是用過curry函數(shù)和div函數(shù)構(gòu)建出leftCurry函數(shù)的;這樣做也限定了柯里化的方向;我們可以通過再編寫一個curry函數(shù)使用另外一種方向來解決這個問題币厕。

再說一個自動柯里化的用處列另。這個柯里化如下:

function curry(func) {
  return function (args) {
    return func(args);
  }
}

直觀上看這個柯里化有什么用?為什么不直接使用func(args)呢旦装?

這個柯里化的場景在使用這樣的語句時格外有用[11, 11, 11, 11].map(parseInt)時格外有用页衙。這行代碼貌似會返回[11, 11, 11, 11],但實際上的返回結(jié)果是[11, NaN, 3, 4]阴绢。

這是為什么呢店乐?我們看了map的源碼就能知道,map接收的函數(shù)呻袭,實際上是一個iteratee(item, index, array)响巢,也就是說,這行代碼實際運行的是[parseInt(11, 0, array) parseInt(11, 1, array), parseInt(11, 2, array), parseInt(11, 3, array)]棒妨。

為了避免給這個iteratee傳入過多的參數(shù),我們可以通過柯里化返回一個只接受一個參數(shù)的函數(shù)

[11, 11, 11, 11].parseInt(curry(parseInt))含长,這樣我們就能得到理想的結(jié)果[11, 11, 11, 11].

柯里化的缺點

柯里化明顯只適合于有限參數(shù)的函數(shù)券腔;如果函數(shù)的參數(shù)過多(當然我們杜絕設計這樣的函數(shù))或者函數(shù)的參數(shù)未定,那就不適合用柯里化來構(gòu)建函數(shù)拘泞。這時就更適合用partial纷纫。

partial

bind的實現(xiàn)其實就有partial的寫法;因為bind在傳遞上下文的時候陪腌,也是可以傳部分參數(shù)的辱魁。

Function.prototype.bind = function (context) {
  context = Obejct(context) || window;
  // 保存一部分參數(shù)
  var args = [].slice.call(arguments, 1);
  // ...其他操作

  return function () {
    // 補全參數(shù)
    args = args.concat([].slice.call(arguments));
  }
}

compose

compose就是拼接函數(shù),返回一系列函數(shù)組合后的復合函數(shù)诗鸭,好比在數(shù)學里, 把函數(shù) f(), g(), 和 h() 組合起來可以得到復合函數(shù) f(g(h()))染簇。

遞歸

  1. 遞歸最有名的應用就是深克隆
  2. 遞歸操作都應該被封裝

函數(shù)式編程的組成

這里有兩個React講到的概念:純函數(shù),不變性强岸。

純函數(shù)

什么是純函數(shù)锻弓?

  1. 返回結(jié)果只由參數(shù)決定,不受外部數(shù)據(jù)的影響
  2. 不改變外部狀態(tài)
  3. 不受Math.random蝌箍,Date.now影響青灼,沒有this,沒有全局變量

純函數(shù)便于函數(shù)的組成妓盲,有助于消除函數(shù)組合出來新的行為正確與否的擔憂:純函數(shù)的組合依舊是純函數(shù)杂拨。

不變性

js中的String類是最適合說不變性的。字符串類型的變量在調(diào)用方法后悯衬,返回調(diào)用后的值弹沽,但字符串本身是沒有被改變的。

鏈式調(diào)用

鏈式調(diào)用看underscore_.chain的源碼就好。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贷币,一起剝皮案震驚了整個濱河市击胜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌役纹,老刑警劉巖偶摔,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異促脉,居然都是意外死亡辰斋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門瘸味,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宫仗,“玉大人,你說我怎么就攤上這事旁仿∨悍颍” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵枯冈,是天一觀的道長毅贮。 經(jīng)常有香客問我,道長尘奏,這世上最難降的妖魔是什么滩褥? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮炫加,結(jié)果婚禮上瑰煎,老公的妹妹穿的比我還像新娘。我一直安慰自己俗孝,他們只是感情好酒甸,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赋铝,像睡著了一般烘挫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柬甥,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天饮六,我揣著相機與錄音,去河邊找鬼苛蒲。 笑死卤橄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的臂外。 我是一名探鬼主播窟扑,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼喇颁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嚎货?” 一聲冷哼從身側(cè)響起橘霎,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殖属,沒想到半個月后姐叁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡洗显,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年外潜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠唆。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡处窥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玄组,到底是詐尸還是另有隱情滔驾,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布俄讹,位于F島的核電站嵌灰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颅悉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一迁匠、第九天 我趴在偏房一處隱蔽的房頂上張望剩瓶。 院中可真熱鬧,春花似錦城丧、人聲如沸延曙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枝缔。三九已至,卻和暖如春蚊惯,著一層夾襖步出監(jiān)牢的瞬間愿卸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工截型, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趴荸,地道東北人。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓宦焦,卻偏偏與公主長得像发钝,于是被迫代替她去往敵國和親顿涣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

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