成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript currying柯里化詳解

mengbo / 1152人閱讀

摘要:面試題實(shí)現(xiàn)結(jié)果,題的核心就是問的的柯里化先說說什么是柯里化,看過許多關(guān)于柯里化的文章,始終搞不太清楚,例如柯里化是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)最初函數(shù)的第一個(gè)參數(shù)的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。

面試題:實(shí)現(xiàn)add(1)(2)(3) //結(jié)果 = 6,題的核心就是問的js的柯里化

先說說什么是柯里化,看過許多關(guān)于柯里化的文章,始終搞不太清楚,例如:柯里化(Currying)是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。大多數(shù)的blog都是這種說法,說實(shí)話我是懵逼的。
我的理解是,curry是一個(gè)收集參數(shù)的方法,收集夠了去執(zhí)行函數(shù)。

實(shí)現(xiàn)前我們先列一下要點(diǎn)
1、收集參數(shù)(就像面試題多次執(zhí)行多個(gè)參數(shù))是的利用閉包
2、每次執(zhí)行參數(shù)有多有少例如add(1)(2,3)(4)
3、我們需要知道什么時(shí)候參數(shù)夠了

        //如題
        //add(1)(2)(3)
        //邏輯應(yīng)該是這樣add(1)執(zhí)行收集參數(shù)1繼續(xù)執(zhí)行收集參數(shù)2依次類推直到收集完畢。
       function curry(fn) {
            let arg = []; //用于收集參數(shù)
            //做一個(gè)閉包https://segmentfault.com/a/1190000017824877
            return function() {
                //每執(zhí)行一次收集一次參數(shù),為什么用concat是因?yàn)橛袝r(shí)候后是多個(gè)參數(shù)(2,3)
                arg = arg.concat([...arguments]);
                //直到參數(shù)收集完成執(zhí)行fn
                // 我們需要知道什么時(shí)候收集完了,條件就是curry參數(shù)fn的參數(shù)個(gè)數(shù) fn.length
                //如果收集的參數(shù)個(gè)數(shù)大于等于fn的參數(shù)個(gè)數(shù)執(zhí)行fn,如果沒有遞歸執(zhí)行
                if (arg.length >= fn.length) {
                    return fn(...arg)
                }
                // 參數(shù)沒有收集完我們需要繼續(xù)收集,遞歸
                return arguments.callee
            }
        }

        // 測(cè)試一下
        let testAdd = curry(add1)
        // console.log(testAdd(1)(2)(3))
        // console.log(testAdd(1, 2)(3))
        //console.log(testAdd(1)(2, 3))

一不小心寫完了!

不過不能標(biāo)題黨,說好的詳解,接下來我們解析一下網(wǎng)上大多數(shù)柯里化的實(shí)現(xiàn)代碼

function curry(fn) {
  function _c(restNum, argsList) {
    return restNum === 0 ?
      fn.apply(null, argsList) :
      function(x) {
        return _c(restNum - 1, argsList.concat(x));
      };
  }
  return _c(fn.length, []);
}

一眼看不明白沒事,我們多看幾眼。
解析:
1、curry也是接收一個(gè)參數(shù)(fn)這個(gè)是必然
2、返回了一個(gè)函數(shù),接收兩個(gè)參數(shù),fn.length和一個(gè)空數(shù)組這個(gè)好解
釋,我寫的簡(jiǎn)版也說過了,fn.length是為了判斷參數(shù)是否收集夠
了,參數(shù)傳一個(gè)空數(shù)組其實(shí)也是閉包的一種實(shí)現(xiàn),用來收集參數(shù)。
3、里邊是一個(gè)三目判斷,看著花里胡哨的沒那么復(fù)雜,判斷fn的參數(shù)個(gè)數(shù)如果是0,那就沒必要收集了直接執(zhí)行fn,至于fn.apply(null,argList)我很明白的大聲說出來會(huì)用個(gè)apply就到處用嗎?在我看來沒有一分錢用,之所以用是因?yàn)閍rgList是一個(gè)數(shù)組,正好apply正好支持第二個(gè)參數(shù)是數(shù)組,主要看起來很牛逼的樣子。
4、收集參數(shù),fn參數(shù)個(gè)數(shù)不為零,每次收集fn函數(shù)參數(shù)的個(gè)數(shù)減一,直到等于0執(zhí)行fn,這個(gè)就沒有我寫的通用了,我一次傳倆就掛了。

再來一個(gè)例子:bind方法實(shí)現(xiàn)

Function.prototype.bind = function(context) {
            //返回一個(gè)綁定this的函數(shù),我們需要在此保存this
            let self = this
                // 可以支持柯里化傳參,保存參數(shù)
            let arg = [...arguments].slice(1)
                // 返回一個(gè)函數(shù)
            return function() {
                //同樣因?yàn)橹С挚吕锘问絺鲄⑽覀冃枰俅潍@取存儲(chǔ)參數(shù)
                let newArg = [...arguments]
                console.log(newArg)
                    // 返回函數(shù)綁定this,傳入兩次保存的參數(shù)
                    //考慮返回函數(shù)有返回值做了return
                return self.apply(context, arg.concat(newArg))
            }
        }

        // 搞定測(cè)試
        let fn = Person.say.bind(Person1)
        fn()
        fn(18)

是的bind方法就是用的柯里化,bind實(shí)現(xiàn)詳情請(qǐng)移步:https://segmentfault.com/a/11...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101354.html

相關(guān)文章

  • 掌握JavaScript函數(shù)的柯里

    摘要:原文鏈接和都支持函數(shù)的柯里化函數(shù)的柯里化還與的函數(shù)編程有很大的聯(lián)系如果你感興趣的話可以在這些方面多下功夫了解相信收獲一定很多看本篇文章需要知道的一些知識(shí)點(diǎn)函數(shù)部分的閉包高階函數(shù)不完全函數(shù)文章后面有對(duì)這些知識(shí)的簡(jiǎn)單解釋大家可以看看什么是柯里化 原文鏈接 Haskell和scala都支持函數(shù)的柯里化,JavaScript函數(shù)的柯里化還與JavaScript的函數(shù)編程有很大的聯(lián)系,如果你感興...

    DTeam 評(píng)論0 收藏0
  • 函數(shù)式編程之柯里和組合詳解

    摘要:提到函數(shù)式編程,就不得不提柯里化和組合。說實(shí)話,在之前的項(xiàng)目開發(fā)中,對(duì)柯里化和組合的運(yùn)用不是太多,因?yàn)椴惶宄?yīng)該在哪些情況下應(yīng)該使用它們。所以在這篇文章中,我們將詳細(xì)的介紹柯里化和組合的用法以及使用場(chǎng)景。 提到函數(shù)式編程,就不得不提柯里化和組合。說實(shí)話,在之前的項(xiàng)目開發(fā)中,對(duì)柯里化和組合的運(yùn)用不是太多,因?yàn)椴惶宄?yīng)該在哪些情況下應(yīng)該使用它們。所以在這篇文章中,我們將詳細(xì)的介紹柯里化...

    Jonathan Shieber 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)式編程

    摘要:函數(shù)式編程,一看這個(gè)詞,簡(jiǎn)直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語言的理解更加融會(huì)貫通一些。但從根本上來說,函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...

    csRyan 評(píng)論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)對(duì)方案,讓我們的函數(shù)更具自由度和靈活性。 showImg(https://segmentfault.com/img/bVburN1?w=800&h=600); 柯里化(Curring, 以邏輯學(xué)家Has...

    chengtao1633 評(píng)論0 收藏0
  • 高級(jí)函數(shù)技巧-函數(shù)柯里

    摘要:如果你對(duì)函數(shù)式編程有一定了解,函數(shù)柯里化是不可或缺的,利用函數(shù)柯里化,可以在開發(fā)中非常優(yōu)雅的處理復(fù)雜邏輯。同樣先看簡(jiǎn)單版本的方法,以方法為例,代碼來自高級(jí)程序設(shè)計(jì)加強(qiáng)版實(shí)現(xiàn)上面函數(shù),可以換成任何其他函數(shù),經(jīng)過函數(shù)處理,都可以轉(zhuǎn)成柯里化函數(shù)。 我們經(jīng)常說在Javascript語言中,函數(shù)是一等公民,它們本質(zhì)上是十分簡(jiǎn)單和過程化的??梢岳煤瘮?shù),進(jìn)行一些簡(jiǎn)單的數(shù)據(jù)處理,return 結(jié)果,...

    shixinzhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

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