在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,儘管它是 Moses Schnfinkel 和 Gottlob Frege 發明的。
舉個例子,假設程序員A是個妻管嚴,工資悉數上交給妻子,爲了買一個心愛的鍵盤
前端
程序員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還要拿個小本本把天天存了多少錢先記錄下來!!!萬一這個本子被發現那就少不了跪鍵盤了,極度不安全。
設計模式
實際上,天天記錄下當前的數據是不靈活的,而函數柯里化則有效地解決了這個問題。
咱們想要這樣存儲咱們的私房錢數組
// 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的不少思想和設計模式中,閉包是個很常見且很重要的東西,上述的代碼中,本質上就是利用了閉包。
該函數是個當即執行函數,返回了一個新函數,而這個新函數實際上就是一個閉包,這個新函數把每次接收到的參數都存儲起來,
而且繼續返回一個新函數,當發現某次調用的時候沒有傳入參數,那就意味着要進行數據統計,從而把以前存儲的數據一次性拿
出來計算,最後返回計算結果。其流程以下:
微信
所謂的函數柯里化,亦或者在開發中涉及到的其餘一些概念,例如閉包、單例模式、觀察者模式等等都好,咱們須要關注的點在於掌握
這些模式或者概念中的代碼設計思想,從而更好地服務於咱們的業務開發,讓咱們的代碼更健壯、靈活、高效。閉包
獲取更多知識,請微信掃碼關注公衆號關注早讀君,天天早晨爲你推送前端知識,度過擠地鐵坐公交的時光。
並且不定時舉辦活動贈送書籍哦函數