国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

「前端早讀君004」函數(shù)柯里化(Currying)小實(shí)踐

light / 2795人閱讀

摘要:更安全地藏私房錢(qián)實(shí)際上,每天記錄下當(dāng)前的數(shù)據(jù)是不靈活的,而函數(shù)柯里化則有效地解決了這個(gè)問(wèn)題。而且不定時(shí)舉辦活動(dòng)贈(zèng)送書(shū)籍哦

什么是函數(shù)柯里化

在計(jì)算機(jī)科學(xué)中,柯里化(Currying)是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。這個(gè)技術(shù)由 Christopher Strachey 以邏輯學(xué)家 Haskell Curry 命名的,盡管它是 Moses Schnfinkel 和 Gottlob Frege 發(fā)明的。
舉個(gè)例子,假設(shè)程序員A是個(gè)妻管?chē)?yán),工資悉數(shù)上交給妻子,為了買(mǎi)一個(gè)心愛(ài)的鍵盤(pán)

程序員A每天都偷偷藏幾毛錢(qián),打算年底買(mǎi)個(gè)鍵盤(pán),因此程序員A寫(xiě)了以下這個(gè)方法用來(lái)統(tǒng)計(jì)年終一共湊了多少錢(qián),方法如下:

/**
 * @description 統(tǒng)計(jì)金額
 * @return {number}
 */
function countMoney() {
  let money = 0
  // 溫馨提示:arguments是所接收的所有參數(shù)組成的類(lèi)數(shù)組,不懂的需要搜一搜補(bǔ)補(bǔ)知識(shí)啦
  for (let i = 0; i < arguments.length; i++) {
    money += arguments[i]
  }

  return money
}
// 藏了一年的賬本記錄的數(shù)據(jù)
const records = [1, 1, 2, 2, 3, 3, 4, 4]
// 把全部數(shù)據(jù)都輸入進(jìn)行計(jì)算
countMoney(1, 1, 2, 2, 3, 3, 4, 4)

上面代碼所呈現(xiàn)的方法,是最直接的計(jì)算方法,其不方便的地方在于,程序員A還要拿個(gè)小本本把每天存了多少錢(qián)先記錄下來(lái)!!!萬(wàn)一這個(gè)本子被發(fā)現(xiàn)那就少不了跪鍵盤(pán)了,極度不安全。

更安全地藏私房錢(qián)

實(shí)際上,每天記錄下當(dāng)前的數(shù)據(jù)是不靈活的,而函數(shù)柯里化則有效地解決了這個(gè)問(wèn)題。
我們想要這樣存儲(chǔ)我們的私房錢(qián)

// 2018-01-01 存了1毛錢(qián)
countMoney(1)
// 2018-01-02 存了2毛錢(qián)
countMoney(2)
// 2018-01-03 存了3毛錢(qián)
countMoney(3)
// 2018-01-04 存了4毛錢(qián)
countMoney(4)
//一年以后
// 統(tǒng)計(jì)這筆巨額存款
countMoney()

上述的這種方法中,我們不關(guān)心數(shù)據(jù)的存儲(chǔ)記錄,我們只需要每天往存錢(qián)罐里面塞錢(qián),然后年底取出來(lái)就是一個(gè)總和。再也不擔(dān)心留下小本本作為證據(jù)了!

函數(shù)柯里化代碼的實(shí)現(xiàn)
/**
 * @description countMoney為立即執(zhí)行函數(shù),返回的結(jié)果是另一個(gè)函數(shù)
 */
const countMoney = (function () {
  let money = 0
  let args = []
  const res = function () {
    if (arguments.length === 0) {
      for (let i = 0; i < args.length; i++) {
        money += args[i]
      }
      return money
    } else {
      // arguments 是個(gè)類(lèi)數(shù)組來(lái)著,應(yīng)該用展開(kāi)符展開(kāi)才能push進(jìn)去
      args.push(...arguments)
      return res
    }
  }
  return res
})()

// 2018-01-01 存了1毛錢(qián)
countMoney(1)
// 2018-01-02 存了2毛錢(qián)
countMoney(2)
// 2018-01-03 存了3毛錢(qián)
countMoney(3)
// 2018-01-04 存了4毛錢(qián)
countMoney(4)
//一年以后
// 統(tǒng)計(jì)這筆巨額存款 輸出結(jié)果為 10
console.log(countMoney())
// 你還可以裝逼地進(jìn)行花式統(tǒng)計(jì),結(jié)果同樣是10
countMoney(1)(2)(3)(4)()
分析代碼

實(shí)際上,在JavaScript的很多思想和設(shè)計(jì)模式中,閉包是個(gè)很常見(jiàn)且很重要的東西,上述的代碼中,本質(zhì)上就是利用了閉包。
該函數(shù)是個(gè)立即執(zhí)行函數(shù),返回了一個(gè)新函數(shù),而這個(gè)新函數(shù)實(shí)際上就是一個(gè)閉包,這個(gè)新函數(shù)把每次接收到的參數(shù)都存儲(chǔ)起來(lái),
并且繼續(xù)返回一個(gè)新函數(shù),當(dāng)發(fā)現(xiàn)某次調(diào)用的時(shí)候沒(méi)有傳入?yún)?shù),那就意味著要進(jìn)行數(shù)據(jù)統(tǒng)計(jì),從而把之前存儲(chǔ)的數(shù)據(jù)一次性拿
出來(lái)計(jì)算,最后返回計(jì)算結(jié)果。其流程如下:

總結(jié)

所謂的函數(shù)柯里化,亦或者在開(kāi)發(fā)中涉及到的其他一些概念,例如閉包、單例模式、觀(guān)察者模式等等都好,我們需要關(guān)注的點(diǎn)在于掌握
這些模式或者概念中的代碼設(shè)計(jì)思想,從而更好地服務(wù)于我們的業(yè)務(wù)開(kāi)發(fā),讓我們的代碼更健壯、靈活、高效。

獲取更多知識(shí),請(qǐng)微信掃碼關(guān)注公眾號(hào)關(guān)注早讀君,每天早晨為你推送前端知識(shí),度過(guò)擠地鐵坐公交的時(shí)光。
而且不定時(shí)舉辦活動(dòng)贈(zèng)送書(shū)籍哦

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/52850.html

相關(guān)文章

  • 前端早讀004函數(shù)柯里Currying實(shí)踐

    摘要:更安全地藏私房錢(qián)實(shí)際上,每天記錄下當(dāng)前的數(shù)據(jù)是不靈活的,而函數(shù)柯里化則有效地解決了這個(gè)問(wèn)題。而且不定時(shí)舉辦活動(dòng)贈(zèng)送書(shū)籍哦 什么是函數(shù)柯里化 在計(jì)算機(jī)科學(xué)中,柯里化(Currying)是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。這個(gè)技術(shù)由 Christopher Strachey 以邏輯學(xué)家 Haskell ...

    Barry_Ng 評(píng)論0 收藏0
  • 掌握J(rèn)avaScript函數(shù)柯里

    摘要:原文鏈接和都支持函數(shù)的柯里化函數(shù)的柯里化還與的函數(shù)編程有很大的聯(lián)系如果你感興趣的話(huà)可以在這些方面多下功夫了解相信收獲一定很多看本篇文章需要知道的一些知識(shí)點(diǎn)函數(shù)部分的閉包高階函數(shù)不完全函數(shù)文章后面有對(duì)這些知識(shí)的簡(jiǎn)單解釋大家可以看看什么是柯里化 原文鏈接 Haskell和scala都支持函數(shù)的柯里化,JavaScript函數(shù)的柯里化還與JavaScript的函數(shù)編程有很大的聯(lián)系,如果你感興...

    DTeam 評(píng)論0 收藏0
  • JS中的柯里

    摘要:作為函數(shù)式編程語(yǔ)言,帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。個(gè)人理解不知道對(duì)不對(duì)延遲執(zhí)行柯里化的另一個(gè)應(yīng)用場(chǎng)景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。 作為函數(shù)式編程語(yǔ)言,JS帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。 這里可以對(duì)照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡(jiǎn)介 柯里化(Currying),又稱(chēng)部分求值(Partial Evalu...

    Hancock_Xu 評(píng)論0 收藏0
  • JavaScript 函數(shù)式編程技巧 - 柯里

    摘要:作為函數(shù)式編程語(yǔ)言,帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。在一些函數(shù)式編程語(yǔ)言中,會(huì)定義一個(gè)特殊的占位變量。個(gè)人理解不知道對(duì)不對(duì)延遲執(zhí)行柯里化的另一個(gè)應(yīng)用場(chǎng)景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。作為函數(shù)式編程語(yǔ)言,JS帶來(lái)了很多語(yǔ)言上的有趣特性,比如柯里化和反柯里化。 這里可以對(duì)照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡(jiǎn)介 柯里化(Currying)...

    edgardeng 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)式編程

    摘要:函數(shù)式編程,一看這個(gè)詞,簡(jiǎn)直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語(yǔ)言的理解更加融會(huì)貫通一些。但從根本上來(lái)說(shuō),函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...

    csRyan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<