摘要:更安全地藏私房錢實際上,每天記錄下當前的數據是不靈活的,而函數柯里化則有效地解決了這個問題。而且不定時舉辦活動贈送書籍哦
什么是函數柯里化
在計算機科學中,柯里化(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的很多思想和設計模式中,閉包是個很常見且很重要的東西,上述的代碼中,本質上就是利用了閉包。
該函數是個立即執行函數,返回了一個新函數,而這個新函數實際上就是一個閉包,這個新函數把每次接收到的參數都存儲起來,
并且繼續返回一個新函數,當發現某次調用的時候沒有傳入參數,那就意味著要進行數據統計,從而把之前存儲的數據一次性拿
出來計算,最后返回計算結果。其流程如下:
所謂的函數柯里化,亦或者在開發中涉及到的其他一些概念,例如閉包、單例模式、觀察者模式等等都好,我們需要關注的點在于掌握
這些模式或者概念中的代碼設計思想,從而更好地服務于我們的業務開發,讓我們的代碼更健壯、靈活、高效。
獲取更多知識,請微信掃碼關注公眾號關注早讀君,每天早晨為你推送前端知識,度過擠地鐵坐公交的時光。
而且不定時舉辦活動贈送書籍哦
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/52850.html
摘要:更安全地藏私房錢實際上,每天記錄下當前的數據是不靈活的,而函數柯里化則有效地解決了這個問題。而且不定時舉辦活動贈送書籍哦 什么是函數柯里化 在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell ...
摘要:原文鏈接和都支持函數的柯里化函數的柯里化還與的函數編程有很大的聯系如果你感興趣的話可以在這些方面多下功夫了解相信收獲一定很多看本篇文章需要知道的一些知識點函數部分的閉包高階函數不完全函數文章后面有對這些知識的簡單解釋大家可以看看什么是柯里化 原文鏈接 Haskell和scala都支持函數的柯里化,JavaScript函數的柯里化還與JavaScript的函數編程有很大的聯系,如果你感興...
摘要:作為函數式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。個人理解不知道對不對延遲執行柯里化的另一個應用場景是延遲執行。不斷的柯里化,累積傳入的參數,最后執行。 作為函數式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying),又稱部分求值(Partial Evalu...
摘要:作為函數式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。在一些函數式編程語言中,會定義一個特殊的占位變量。個人理解不知道對不對延遲執行柯里化的另一個應用場景是延遲執行。不斷的柯里化,累積傳入的參數,最后執行。作為函數式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying)...
摘要:函數式編程,一看這個詞,簡直就是學院派的典范。所以這期周刊,我們就重點引入的函數式編程,淺入淺出,一窺函數式編程的思想,可能讓你對編程語言的理解更加融會貫通一些。但從根本上來說,函數式編程就是關于如使用通用的可復用函數進行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數式編程(Functional Programming),一...
閱讀 1274·2021-11-17 09:33
閱讀 1742·2021-09-09 11:53
閱讀 3208·2021-09-04 16:45
閱讀 1382·2021-08-17 10:12
閱讀 2383·2019-08-30 15:55
閱讀 1779·2019-08-30 15:53
閱讀 2404·2019-08-30 15:52
閱讀 2558·2019-08-29 18:41