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