国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

柯里化的理解和實(shí)現(xiàn)

hsluoyz / 1280人閱讀

摘要:閱讀學(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

相關(guān)文章

  • 「前端面試題系列6」理解函數(shù)的柯里

    摘要:原題如下寫一個(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ù)的...

    liaorio 評論0 收藏0
  • 前端進(jìn)擊的巨人(五):學(xué)會(huì)函數(shù)柯里化(curry)

    摘要:函數(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...

    chengtao1633 評論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(八):深入詳解函數(shù)的柯里

    摘要:函數(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)用,想要...

    kk_miles 評論0 收藏0
  • 從一道面試題認(rèn)識(shí)函數(shù)柯里

    摘要:函數(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í)行,...

    13651657101 評論0 收藏0
  • JavaScript函數(shù)式編程,真香之組合(一)

    摘要:組合的概念是非常直觀的,并不是函數(shù)式編程獨(dú)有的,在我們生活中或者前端開發(fā)中處處可見。其實(shí)我們函數(shù)式編程里面的組合也是類似,函數(shù)組合就是一種將已被分解的簡單任務(wù)組織成復(fù)雜的整體過程。在函數(shù)式編程的世界中,有這樣一種很流行的編程風(fēng)格。 JavaScript函數(shù)式編程,真香之認(rèn)識(shí)函數(shù)式編程(一) 該系列文章不是針對前端新手,需要有一定的編程經(jīng)驗(yàn),而且了解 JavaScript 里面作用域,閉...

    mengbo 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<