成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS每日一題:函數(shù)式編程中代碼組合(compose)如何理解?

Kaede / 768人閱讀

摘要:期函數(shù)式編程中代碼組合如何理解定義顧名思義,在函數(shù)式編程中,就是將幾個有特點的函數(shù)拼湊在一起,讓它們結(jié)合,產(chǎn)生一個嶄新的函數(shù)代碼理解一個將小寫轉(zhuǎn)大寫的函數(shù)一個在字符后加的函數(shù)將兩個函數(shù)組合起來這里假設(shè)我們實現(xiàn)了每日一題每日一題顯示結(jié)果里上面

20190315期

函數(shù)式編程中代碼組合(compose)如何理解?

定義: 顧名思義,在函數(shù)式編程中,Compose就是將幾個有特點的函數(shù)拼湊在一起, 讓它們結(jié)合, 產(chǎn)生一個嶄新的函數(shù)

代碼理解:

// 一個將小寫轉(zhuǎn)大寫的函數(shù)
let toUpperCase = (x) => x.toUpperCase();

// 一個在字符后加!的函數(shù)
let exclaim = (x) => x + "!";

// 將兩個函數(shù)組合起來, 這里假設(shè)我們實現(xiàn)了compose
let shout = compose(toUpperCase,exclaim);

shout("js每日一題") // JS每日一題 !, 顯示結(jié)果里上面兩個函數(shù)的特點都應(yīng)用上了
pointfree

代碼組合中有一個重要的概念pointfree(永遠不要說出你的數(shù)據(jù)), 它的意思是指函數(shù)無須提及將要操作的數(shù)據(jù)是什么樣的

有點晦澀,我們還是上代碼理解一下

// 我們有一個將字符轉(zhuǎn)換成大寫并且將其空格轉(zhuǎn)換為"-"的函數(shù)
// 細節(jié)的同學(xué)應(yīng)該發(fā)現(xiàn)這個函數(shù)暴露了一個word形參
// 根據(jù)pointfree定義,此函數(shù)非pointfree模式
let snakeCase = (word) => word.toUpperCase().replace(/s+/ig,"-");

// 下面這個函數(shù)與上面的功能一致,但我們可以觀察到其沒有數(shù)據(jù)暴露,所以其為pointfree模式
let snakeCase = compose(replace(/s+/ig,"-"),toUpperCase)

說了這么多,他能干什么呢 ? 它能夠幫助我們減少不必要的命名,讓代碼保持簡潔和通用

compose實現(xiàn)

上面我們都是假設(shè)已經(jīng)存在compose方法, 接下來我們來為其實現(xiàn)

首先分析其特性

兩個函數(shù)都有一個共同的參數(shù)

函數(shù)的執(zhí)行順序從右至左

前面函數(shù)執(zhí)行的結(jié)果交由后面的函數(shù)處理

根據(jù)上面的示例及我們分析的特性來實現(xiàn)一個最簡版的

// 這樣子其實就能滿足我們上面示例的要求了
const compose = function(f, g) {
  return function(x) {
    return f(g(x));
  };
};

結(jié)束了嗎? 并沒有,我們可以看到上面的compose示例都只是傳入了兩個函數(shù),因為我們的簡版compose實現(xiàn)也只支持兩個函數(shù),那么如果我們想要支持一條很長很長的管道的時候,顯然上面的compose就不夠用了, 接著我們來看優(yōu)秀的開源庫redux的compose實現(xiàn)

// 摘自 https://github.com/reactjs/redux/blob/master/src/compose.js
export default function compose(...funcs) {
  // 沒有傳入函數(shù)運行直接返回參數(shù)
  if (funcs.length === 0) {
    return arg => arg
  }
  // 只傳入一個函數(shù),就返回其本身
  if (funcs.length === 1) {
    return funcs[0]
  }
  
  // 核心代碼其實就是一句reduce, reduce特性就是按順序執(zhí)行,并且將結(jié)果傳遞給下一次執(zhí)行, 這里多說一句, reduce順序執(zhí)行多個相依賴的promise也很好用
  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}
總結(jié)

將多個單特性的函數(shù)組合到一起的函數(shù)

多個函數(shù)服務(wù)一組數(shù)據(jù)(共同參數(shù))

不必說出數(shù)據(jù)(pointfree)

函數(shù)從右至左順序執(zhí)行,結(jié)果做為下一個函數(shù)的參數(shù)

關(guān)于JS每日一題

JS每日一題可以看成是一個語音答題社區(qū)
每天利用碎片時間采用60秒內(nèi)的語音形式來完成當天的考題
群主在次日0點推送當天的參考答案

注 絕不僅限于完成當天任務(wù),更多是查漏補缺,學(xué)習(xí)群內(nèi)其它同學(xué)優(yōu)秀的答題思路

點擊加入答題

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102720.html

相關(guān)文章

  • JS每日一題函數(shù)編程中純函數(shù)如何理解?

    摘要:期函數(shù)式編程中純函數(shù)如何理解概念不依賴執(zhí)行的上下文,也不影響上下文的變量,輸出只由輸入決定代碼理解一下綜上,非純函數(shù)輸入依賴外部變量綜上,非純函數(shù)輸出改變外部變量綜上純函數(shù)輸出輸入不影響外部變量純函數(shù)的好處相信大家發(fā)現(xiàn)了,無論是概念還是代碼 20190313期 函數(shù)式編程中純函數(shù)如何理解? 概念: 不依賴執(zhí)行的上下文,也不影響上下文的變量,輸出只由輸入決定 代碼理解一下 // 綜上,非...

    Zoom 評論0 收藏0
  • 淺析Redux源

    摘要:用法源碼由在年創(chuàng)建的科技術(shù)語。我們除去源碼校驗函數(shù)部分,從最終返回的大的來看。這個返回值無法被識別。洋蔥模型我們來看源碼源碼每個都以作為參數(shù)進行注入,返回一個新的鏈。改變原始組數(shù),是一種副作用。 @(Redux)[|用法|源碼] Redux 由Dan Abramov在2015年創(chuàng)建的科技術(shù)語。是受2014年Facebook的Flux架構(gòu)以及函數(shù)式編程語言Elm啟發(fā)。很快,Redux因其...

    lifesimple 評論0 收藏0
  • 前端知識點(二)

    摘要:在給一個目標對象為構(gòu)造函數(shù)的代理對象構(gòu)造實例時觸發(fā)該操作,比如在執(zhí)行時。 1、元素上下垂直居中的方式有哪些? 元素水平垂直居中的方式有哪些? absolute加margin方案 fixed 加 margin 方案 display:table 方案 行內(nèi)元素line-height方案 flex 彈性布局方案 transform 未知元素寬高解決方案 absolute加mar...

    zacklee 評論0 收藏0
  • 前端知識點(二)

    摘要:在給一個目標對象為構(gòu)造函數(shù)的代理對象構(gòu)造實例時觸發(fā)該操作,比如在執(zhí)行時。 1、元素上下垂直居中的方式有哪些? 元素水平垂直居中的方式有哪些? absolute加margin方案 fixed 加 margin 方案 display:table 方案 行內(nèi)元素line-height方案 flex 彈性布局方案 transform 未知元素寬高解決方案 absolute加mar...

    lbool 評論0 收藏0
  • 前端知識點(二)

    摘要:在給一個目標對象為構(gòu)造函數(shù)的代理對象構(gòu)造實例時觸發(fā)該操作,比如在執(zhí)行時。 1、元素上下垂直居中的方式有哪些? 元素水平垂直居中的方式有哪些? absolute加margin方案 fixed 加 margin 方案 display:table 方案 行內(nèi)元素line-height方案 flex 彈性布局方案 transform 未知元素寬高解決方案 absolute加mar...

    Alex 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<