最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js中閉包結(jié)合遞歸等于柯里化原理解析

 更新時間:2022年07月08日 10:14:10   作者:掘金安東尼  
這篇文章主要為大家介紹了閉包結(jié)合遞歸等于柯里化的原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

我們不妨以兩數(shù)相加為例子,遞進說明。

我們通常是這樣寫一個函數(shù)來求得 兩數(shù)相加 的值:

function sum(a,b){
    console.log(a+b)
}
sum(1,2)

這樣寫一點毛病沒有!

不過呢?問題總會在發(fā)展中產(chǎn)生,產(chǎn)品經(jīng)理又要加一個值,需求:三數(shù)相加;

咱通常來說,第一時間,就在原基礎(chǔ)上,直接再加一個參數(shù)就是了;

于是,修改后像是這樣:

function sum(a,b,c){
    console.log(a+b+c)
}
sum(1,2,3)

問:這樣寫,有毛病嗎??

答:太有毛病了!

這樣一改,既違反了:“開閉原則”、又違反了:“單一職責(zé)原則”。

為不太熟悉設(shè)計原則的小伙伴們,簡單解釋下:

  • 什么是“開閉原則”?即:我們編程中要盡可能的避免直接修改函數(shù)、類或模塊,而是要在原有基礎(chǔ)上拓展它;
  • 什么是“單一職責(zé)原則”?即:每個函數(shù)、類或模塊,應(yīng)該只負責(zé)一個單一的功能;

首先,咱修改了 sum 函數(shù)的傳參以及內(nèi)部的調(diào)用 ⇒ 則違反“開閉原則”

其次,sum 函數(shù)本來只負責(zé)兩數(shù)相加,修改后,它又負責(zé)三數(shù)相加,職責(zé)已經(jīng)發(fā)生了變化 ⇒ 則違反 “單一職責(zé)原則”;

如果正規(guī)按照單一責(zé)任來寫,應(yīng)該是:

// 負責(zé)兩數(shù)相加
function sum2(a,b){
    console.log(a+b)
}
// 負責(zé)三數(shù)相加
function sum3(a,b,c){
    console.log(a+b+c)
}

事實上,是不可能這樣去寫的,因為如果有一萬個數(shù)相加,得寫一萬個函數(shù)。

而 加法只有一個!! 不管你最終要加幾個值,總是要一個加一個。

于是乎,我們設(shè)想,能不能寫一個這樣的函數(shù):它的功能,就是“加”,參數(shù)跟幾個,我就加幾個。

// 負責(zé)“加法”,
function addCurry(){
    ...
    ...
    ...
}
addCurry(1)(2) // 兩數(shù)相加
addCurry(1)(2)(3) // 三數(shù)相加
...
addCurry(1)(2)(3)...(n) // n 數(shù)相加

沒錯,這個函數(shù)就是:柯里化?。。ɑ蛘哒f這個過程叫柯里化,這個思想叫柯里化,本瓜認為這里不需要太死扣定義)

接著,我們一步步來試試,它會是怎樣構(gòu)成的?

為了能夠?qū)崿F(xiàn)一個加一個,即存儲參數(shù)的目的,我們想一想,還有什么法寶?

沒錯,JS 奧義:閉包!

其實,本瓜時常想,閉包的終極秘密是什么?最后將其理解為 4 個金光閃閃的大字:延遲處理!

什么意思?簡單解釋下:

function directHandle(a,b){
    console.log("直接處理",a,b)
}
directHandle(111,222)
// 直接處理 111 222
function delayHandle(a){
    return function(b){
         console.log("延遲處理",a,b)
    }
}
delayHandle(111)
// ? (b){
//	    console.log("延遲處理",a,b)
//	}

如上 delayHandle(111) 不像 directHandle(111,222) 直接打印值,而是先返回一個函數(shù) f(b);111 也被臨時保存了,delayHandle(111)(222),則得到相同的輸出。這就是:延遲處理的思想。

另外補一句:

延遲處理是函數(shù)式編程的精華所在,在不能保證每個函數(shù)都是純函數(shù)的前提下,在管道處理的最后,再進行處理,能最大程度的保證減少副作用。也就是 Monad 思想,此處不做展開。

言歸正傳,于是乎,我們借用閉包來實現(xiàn)最初版的柯里化:

// 兩數(shù)相加
function addCurry(a){
    return function(b){
            console.log(a+b)
    }
}
addCurry(1)(2)
// 三數(shù)相加
function addCurry(a){
    return function(b){
        return function(c){
             console.log(a+b+c)
        }
    }
}
addCurry(1)(2)(3)

寫兩個閉包的過程,聰明的你一定就明白了,這樣一直寫下去,不就是遞歸嗎?!

于是乎,我們知道,當(dāng)參數(shù)是 n 個的時候,需要遞歸 n-1 次 return function

于是乎,addCurry 寫法如下:

 let arr = []
 function addCurry() {
     let arg = Array.prototype.slice.call(arguments); // 遞歸獲取后續(xù)參數(shù)
     arr = arr.concat(arg);
      if (arg.length === 0) { // 如果參數(shù)為空,則判斷遞歸結(jié)束
          return arr.reduce((a,b)=>{return a+b}) // 求和
      } else {
          return addCurry;
      }
  }
addCurry(1)(2)(3)()

OK,至此,,大功告成??!

以上,用最簡單的代碼解釋了 —— 為什么我說:柯里化 == 閉包+遞歸 ?

柯里化是一種思想,上面的 addCurry 可以說是最簡單的一種實踐。在函數(shù)式編程中,Curry 更是大放異彩,比如 compose(fn1)(fn2)(fn3)…(fnN)(args) 等等。

如果以后有人再問你柯里化,可以往這個方向上答。。。

以上就是閉包結(jié)合遞歸等于柯里化原理解析的詳細內(nèi)容,更多關(guān)于閉包結(jié)合遞歸等于柯里化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何編寫高質(zhì)量 JavaScript 代碼

    如何編寫高質(zhì)量 JavaScript 代碼

    如果要編寫出高質(zhì)量的 JavaScript 代碼,可以從以下三個方面去考慮。分別是:易閱讀的代碼、高性能的代碼、健壯性的代碼。下面我將分別對這三個方面進行闡述。需要的朋友可以參考一下
    2021-09-09
  • JS深入淺出Function與構(gòu)造函數(shù)

    JS深入淺出Function與構(gòu)造函數(shù)

    這篇文章主要介紹了JS深入淺出Function與構(gòu)造函數(shù),F(xiàn)unction是一個構(gòu)造函數(shù),可以通過該構(gòu)造函數(shù)去創(chuàng)建一個函數(shù),創(chuàng)建的函數(shù)是一個Function對象,具體內(nèi)容請參考下面文章的詳細內(nèi)容,需要的朋友可以參考一下
    2021-12-12
  • ECharts框架分段視覺映射在移動端適配

    ECharts框架分段視覺映射在移動端適配

    這篇文章主要介紹了ECharts框架分段視覺映射在移動端適配詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • JavaScript?執(zhí)行上下文的視角詳解this使用

    JavaScript?執(zhí)行上下文的視角詳解this使用

    這篇文章主要為以JavaScript?執(zhí)行上下文的視角為大家講清楚?this使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • javascript函數(shù)式編程基礎(chǔ)

    javascript函數(shù)式編程基礎(chǔ)

    這篇文章主要介紹了javascript函數(shù)式編程,文章有介紹函數(shù)自核,聲明式和命令式代碼,感興趣的小伙伴可以一起來閱讀下面我文章內(nèi)容
    2021-09-09
  • 微信小程序 Toast自定義實例詳解

    微信小程序 Toast自定義實例詳解

    這篇文章主要介紹了微信小程序 Toast自定義實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Fabric.js 保存自定義屬性方法示例

    Fabric.js 保存自定義屬性方法示例

    這篇文章主要為大家介紹了Fabric.js 保存自定義屬性方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • js 數(shù)組 fill() 填充方法

    js 數(shù)組 fill() 填充方法

    這篇文章主要介紹了js 數(shù)組 fill() 的填充方法,初始化數(shù)組的方法,但是初始化數(shù)組之后,數(shù)組中的每一項元素默認為 empty 空位占位,如何對數(shù)組這些空位添加默認的元素,ES6提供了 fill() 方法實現(xiàn)這一操作。本文總結(jié)數(shù)組 fill() 方法的詳細使用,需要的朋友可以參考一下
    2021-10-10
  • 小程序開發(fā)踩坑:頁面窗口定位(相對于瀏覽器定位)(推薦)

    小程序開發(fā)踩坑:頁面窗口定位(相對于瀏覽器定位)(推薦)

    這篇文章主要介紹了小程序開發(fā)頁面窗口定位,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JavaScript組合繼承詳解

    JavaScript組合繼承詳解

    這篇文章主要介紹了JavaScript組合繼承,下面文章將圍繞了JavaScript組合繼承的相關(guān)資料展開詳細內(nèi)容,需要的小伙伴可以參考一下,希望對你有所幫助
    2021-11-11

最新評論

磐安县| 老河口市| 游戏| 徐水县| 泰顺县| 明光市| 巴青县| 彭水| 工布江达县| 桐柏县| 亳州市| 乡宁县| 璧山县| 岢岚县| 团风县| 隆林| 翁源县| 元阳县| 滁州市| 普定县| 同心县| 新和县| 临洮县| 临汾市| 永康市| 巴彦淖尔市| 馆陶县| 崇礼县| 洱源县| 无极县| 新乐市| 通道| 格尔木市| 会理县| 通山县| 马边| 马龙县| 仁寿县| 内丘县| 乐昌市| 葵青区|