摘要:閱讀學習專題之函數柯里化函數式編程指南對柯里化的理解很多人對于柯里化的理解僅僅停留在復用參數上。使用柯里化的場景想要實現某個操作邏輯。換句話說,柯里化將輸入的函數和參數進行綁定,返回綁定后的函數,返回的函數期待剩余的參數。
閱讀學習
JavaScript專題之函數柯里化
JS 函數式編程指南
很多人對于柯里化的理解僅僅停留在“復用參數”上。但我認為函數式編程思想更重要作用的是:解除函數對執行時參數的依賴,增強函數的泛化能力,讓函數僅僅包含“純粹的操作邏輯”,這些操作邏輯要用在什么樣的輸入上,使用函數時再決定。
使用柯里化的場景:
想要實現某個操作邏輯。(舉一個最簡單的例子,從對象中取出某個屬性的值)
確認這個操作的輸入。(在這個例子中,輸入是對象和屬性key)
將操作的輸入作為函數的參數,解除函數實現對【參數的具體值】的依賴。(function getProp(obj, key))
在函數體中,對這些參數執行一系列操作,實現邏輯。(function getProp(obj, key) { return obj[key]; })
得到的函數就僅僅封裝了“操作邏輯”,函數對于操作的輸入不做任何假設,因此函數的泛化能力很強,可以處理任何合法的輸入。(在這個例子中,getProp可以從任何對象中獲取任何屬性)
“不做任何假設”的說法其實不太準確,比如說getProp就假設了obj參數必須是對象,但這種假設是“完成操作邏輯”的必要要求,“不做任何多余的假設”更準確一些。我在這里使用更絕對的語氣,是為了增強自己對這個觀點的印象。
當用戶使用這個函數封裝的操作邏輯時,調用這個函數,并且需要在參數中提供操作的輸入。函數執行完以后,返回操作的輸出。可以將函數看作一個黑盒子,給什么輸入就會返回對應的輸出,函數本身是“無狀態”的。(在這個例子中,getProp(obj1, "key1")和getProp(obj2, "key2"),函數能適應任何合法的輸入,不管調用多少次,不管傳入什么參數,函數的操作邏輯都不會改變)
通過柯里化,可以在真正執行函數之前先確定某些參數。換句話說,柯里化將輸入的函數和參數進行“綁定”,返回綁定后的函數,返回的函數期待剩余的參數。(比如說,我們經常要從Array的原型中獲取方法,let getPropFromArrProto = curry(getProp, Array.prototype);通過這個新的函數就能直接從Array.prototype中獲取屬性)
實現function curry(fn, ...priorArgs) { const length = fn.length; return function judge(...restArgs) { return priorArgs.length + restArgs.length >= length ? fn.call(this, ...priorArgs, ...restArgs) : function (...args) { return judge.call(this, ...restArgs, ...args); } } } // 測試代碼 var fn = curry(function (a, b, c, d) { console.log([a, b, c, d]); return [a, b, c, d]; }, "p"); fn("a", "b", "c") // [ "p", "a", "b", "c" ] fn("a", "b")("c") // [ "p", "a", "b", "c" ] fn("a")("b")("c") // [ "p", "a", "b", "c" ] fn("a")("b", "c") // [ "p", "a", "b", "c" ]
其中,
priorArgs.length + restArgs.length >= length ? fn.call(this, ...priorArgs, ...restArgs) : function (...args) { return judge.call(this, ...restArgs, ...args); }
它的意思是,如果已經接受的參數數量不少于fn(被柯里化的函數)期待的參數數量,就調用fn并返回結果。
否則,返回一個新的函數,這個函數期待剩余的參數。
調用這個新函數會再次進行參數數量的判斷,如果已經接受的參數數量不少于fn(被柯里化的函數)期待的參數數量,就調用fn并返回結果,否則返回一個新的函數……以此類推。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93729.html
摘要:原題如下寫一個方法,當使用下面的語法調用時,能正常工作這道題要考察的,就是對函數柯里化的理解。當參數只有一個的時候,進行柯里化的處理。這其實就是函數柯里化的簡單應用。 showImg(https://segmentfault.com/img/bVbopGm?w=620&h=350); 前言 這是前端面試題系列的第 6 篇,你可能錯過了前面的篇章,可以在這里找到: ES6 中箭頭函數的...
摘要:函數柯里化是把支持多個參數的函數變成接收單一參數的函數,并返回一個函數能接收處理剩余參數,而反柯里化就是把參數全部釋放出來。但在一些復雜的業務邏輯封裝中,函數柯里化能夠為我們提供更好的應對方案,讓我們的函數更具自由度和靈活性。 showImg(https://segmentfault.com/img/bVburN1?w=800&h=600); 柯里化(Curring, 以邏輯學家Has...
摘要:函數被轉化之后得到柯里化函數,能夠處理的所有剩余參數。因此柯里化也被稱為部分求值。那么函數的柯里化函數則可以如下因此下面的運算方式是等價的。而這里對于函數參數的自由處理,正是柯里化的核心所在。額外知識補充無限參數的柯里化。 showImg(https://segmentfault.com/img/remote/1460000008493346); 柯里化是函數的一個比較高級的應用,想要...
摘要:函數柯里化在函數式編程中,函數是一等公民。函數柯里化的主要作用和特點就是參數復用提前返回和延遲執行。可能在實際應用場景中,很少使用函數柯里化的解決方案,但是了解認識函數柯里化對自身的提升還是有幫助的。 最近在整理面試資源的時候,發現一道有意思的題目,所以就記錄下來。 題目 如何實現 multi(2)(3)(4)=24? 首先來分析下這道題,實現一個 multi 函數并依次傳入參數執行,...
摘要:組合的概念是非常直觀的,并不是函數式編程獨有的,在我們生活中或者前端開發中處處可見。其實我們函數式編程里面的組合也是類似,函數組合就是一種將已被分解的簡單任務組織成復雜的整體過程。在函數式編程的世界中,有這樣一種很流行的編程風格。 JavaScript函數式編程,真香之認識函數式編程(一) 該系列文章不是針對前端新手,需要有一定的編程經驗,而且了解 JavaScript 里面作用域,閉...
閱讀 3868·2021-07-28 18:10
閱讀 2577·2019-08-30 15:44
閱讀 1083·2019-08-30 14:07
閱讀 3455·2019-08-29 17:20
閱讀 1577·2019-08-26 18:35
閱讀 3533·2019-08-26 13:42
閱讀 1816·2019-08-26 11:58
閱讀 1585·2019-08-23 18:33