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

什麼是函數柯里化

在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,儘管它是 Moses Schnfinkel 和 Gottlob Frege 發明的。
舉個例子,假設程序員A是個妻管嚴,工資悉數上交給妻子,爲了買一個心愛的鍵盤
u=3317326080,3565966017&fm=27&gp=0.jpg前端

程序員A天天都偷偷藏幾毛錢,打算年末買個鍵盤,所以程序員A寫了如下這個方法用來統計年終一共湊了多少錢,方法以下:程序員

/**
 * @description 統計金額
 * @return {number}
 */
function countMoney() {
  let money = 0
  // 舒適提示:arguments是所接收的全部參數組成的類數組,不懂的須要搜一搜補補知識啦
  for (let i = 0; i < arguments.length; i++) {
    money += arguments[i]
  }

  return money
}
// 藏了一年的帳本記錄的數據
const records = [1, 1, 2, 2, 3, 3, 4, 4]
// 把所有數據都輸入進行計算
countMoney(1, 1, 2, 2, 3, 3, 4, 4)

上面代碼所呈現的方法,是最直接的計算方法,其不方便的地方在於,程序員A還要拿個小本本把天天存了多少錢先記錄下來!!!萬一這個本子被發現那就少不了跪鍵盤了,極度不安全。
u=864471950,2685274187&fm=27&gp=0.jpg設計模式

更安全地藏私房錢

實際上,天天記錄下當前的數據是不靈活的,而函數柯里化則有效地解決了這個問題。
咱們想要這樣存儲咱們的私房錢數組

// 2018-01-01 存了1毛錢
countMoney(1)
// 2018-01-02 存了2毛錢
countMoney(2)
// 2018-01-03 存了3毛錢
countMoney(3)
// 2018-01-04 存了4毛錢
countMoney(4)
//一年之後
// 統計這筆鉅額存款
countMoney()

上述的這種方法中,咱們不關心數據的存儲記錄,咱們只須要天天往存錢罐裏面塞錢,而後年末取出來就是一個總和。不再擔憂留下小本本做爲證據了!安全

函數柯里化代碼的實現

/**
 * @description countMoney爲當即執行函數,返回的結果是另外一個函數
 */
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 是個類數組來着,應該用展開符展開才能push進去
      args.push(...arguments)
      return res
    }
  }
  return res
})()

// 2018-01-01 存了1毛錢
countMoney(1)
// 2018-01-02 存了2毛錢
countMoney(2)
// 2018-01-03 存了3毛錢
countMoney(3)
// 2018-01-04 存了4毛錢
countMoney(4)
//一年之後
// 統計這筆鉅額存款 輸出結果爲 10
console.log(countMoney())
// 你還能夠裝逼地進行花式統計,結果一樣是10
countMoney(1)(2)(3)(4)()

分析代碼

實際上,在JavaScript的不少思想和設計模式中,閉包是個很常見且很重要的東西,上述的代碼中,本質上就是利用了閉包。
該函數是個當即執行函數,返回了一個新函數,而這個新函數實際上就是一個閉包,這個新函數把每次接收到的參數都存儲起來,
而且繼續返回一個新函數,當發現某次調用的時候沒有傳入參數,那就意味着要進行數據統計,從而把以前存儲的數據一次性拿
出來計算,最後返回計算結果。其流程以下:
5b6d0ab0e4b053a09c2e0a95.png微信

總結

所謂的函數柯里化,亦或者在開發中涉及到的其餘一些概念,例如閉包、單例模式、觀察者模式等等都好,咱們須要關注的點在於掌握
這些模式或者概念中的代碼設計思想,從而更好地服務於咱們的業務開發,讓咱們的代碼更健壯、靈活、高效。閉包

圖片描述

獲取更多知識,請微信掃碼關注公衆號關注早讀君,天天早晨爲你推送前端知識,度過擠地鐵坐公交的時光。
並且不定時舉辦活動贈送書籍哦函數

相關文章
相關標籤/搜索