compose函數(shù)和pipe函數(shù)

compose函數(shù)

compose函數(shù)可以將需要嵌套執(zhí)行的函數(shù)平鋪骨稿,嵌套執(zhí)行就是一個(gè)函數(shù)的返回值將作為另一個(gè)函數(shù)的參數(shù)。我們考慮一個(gè)簡單的需求:

給定一個(gè)輸入值x崔拥,先給這個(gè)值加10贝乎,然后結(jié)果乘以10

這個(gè)需求很簡單柴淘,直接一個(gè)計(jì)算函數(shù)就行:

const calculate = x => (x + 10) * 10;
let res = calculate(10);
console.log(res);    // 200

但是根據(jù)我們之前講的函數(shù)式編程关斜,我們可以將復(fù)雜的幾個(gè)步驟拆成幾個(gè)簡單的可復(fù)用的簡單步驟示括,于是我們拆出了一個(gè)加法函數(shù)和一個(gè)乘法函數(shù):

const add = x => x + 10;
const multiply = x => x * 10;

// 我們的計(jì)算改為兩個(gè)函數(shù)的嵌套計(jì)算铺浇,add函數(shù)的返回值作為multiply函數(shù)的參數(shù)
let res = multiply(add(10));
console.log(res);    // 結(jié)果還是200

上面的計(jì)算方法就是函數(shù)的嵌套執(zhí)行痢畜,而我們compose的作用就是將嵌套執(zhí)行的方法作為參數(shù)平鋪,嵌套執(zhí)行的時(shí)候鳍侣,里面的方法也就是右邊的方法最開始執(zhí)行丁稀,然后往左邊返回,我們的compose方法也是從右邊的參數(shù)開始執(zhí)行倚聚,所以我們的目標(biāo)就很明確了线衫,我們需要一個(gè)像這樣的compose方法:

// 參數(shù)從右往左執(zhí)行,所以multiply在前惑折,add在后
let res = compose(multiply, add)(10);

那這個(gè)compose方法要怎么實(shí)現(xiàn)呢授账,這里需要借助Array.prototype.reduce,這個(gè)方法會(huì)從左往右迭代惨驶,但是我們需要的是從右往左迭代白热,這個(gè)方法是Array.prototype.reduceRight:

const compose = function(){
  // 將接收的參數(shù)存到一個(gè)數(shù)組, args == [multiply, add]
  const args = [].slice.apply(arguments);
  return function(x) {
    return args.reduceRight((res, cb) => cb(res), x);
  }
}

// 我們來驗(yàn)證下這個(gè)方法
let calculate = compose(multiply, add);
let res = calculate(10);
console.log(res);    // 結(jié)果還是200

上面的compose函數(shù)使用ES6的話會(huì)更加簡潔:

const compose = (...args) => x => args.reduceRight((res, cb) => cb(res), x);

Redux的中間件就是用compose實(shí)現(xiàn)的粗卜,webpack中l(wèi)oader的加載順序也是從右往左屋确,這是因?yàn)樗彩?code>compose實(shí)現(xiàn)的。

pipe函數(shù)

pipe函數(shù)跟compose函數(shù)的左右是一樣的续扔,也是將參數(shù)平鋪攻臀,只不過他的順序是從左往右。我們來實(shí)現(xiàn)下纱昧,只需要將reduceRight改成reduce就行了:

const pipe = function(){
  const args = [].slice.apply(arguments);
  return function(x) {
    return args.reduce((res, cb) => cb(res), x);
  }
}

// 參數(shù)順序改為從左往右
let calculate = pipe(add, multiply);
let res = calculate(10);
console.log(res);    // 結(jié)果還是200

ES6寫法:

const pipe = (...args) => x => args.reduce((res, cb) => cb(res), x)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刨啸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子识脆,更是在濱河造成了極大的恐慌呜投,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件存璃,死亡現(xiàn)場離奇詭異仑荐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纵东,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門粘招,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人偎球,你說我怎么就攤上這事洒扎〖穑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵袍冷,是天一觀的道長磷醋。 經(jīng)常有香客問我,道長胡诗,這世上最難降的妖魔是什么邓线? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮煌恢,結(jié)果婚禮上骇陈,老公的妹妹穿的比我還像新娘。我一直安慰自己瑰抵,他們只是感情好你雌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著二汛,像睡著了一般婿崭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肴颊,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天氓栈,我揣著相機(jī)與錄音,去河邊找鬼苫昌。 笑死颤绕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祟身。 我是一名探鬼主播奥务,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袜硫!你這毒婦竟也來了氯葬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤婉陷,失蹤者是張志新(化名)和其女友劉穎帚称,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秽澳,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闯睹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了担神。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楼吃。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孩锡,到底是詐尸還是另有隱情酷宵,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布躬窜,位于F島的核電站浇垦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荣挨。R本人自食惡果不足惜男韧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垦沉。 院中可真熱鬧煌抒,春花似錦仍劈、人聲如沸厕倍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讹弯。三九已至,卻和暖如春这溅,著一層夾襖步出監(jiān)牢的瞬間组民,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工悲靴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臭胜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓癞尚,卻偏偏與公主長得像耸三,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浇揩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 有以下需求:創(chuàng)建一個(gè)compose函數(shù),返回函數(shù)集 functions 組合后的復(fù)合函數(shù), 也就是一個(gè)函數(shù)執(zhí)行完之...
    _Dot912閱讀 15,370評(píng)論 3 6
  • 感謝社區(qū)中各位的大力支持仪壮,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠胳徽,并抽取幸運(yùn)大獎(jiǎng):點(diǎn)擊這里領(lǐng)取 你...
    HetfieldJoe閱讀 740評(píng)論 0 2
  • 感謝社區(qū)中各位的大力支持积锅,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠养盗,并抽取幸運(yùn)大獎(jiǎng):點(diǎn)擊這里領(lǐng)取 至...
    HetfieldJoe閱讀 883評(píng)論 0 2
  • 函數(shù)和對(duì)象 1缚陷、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句往核,而且...
    道無虛閱讀 4,566評(píng)論 0 5
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,237評(píng)論 0 4