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

資訊專欄INFORMATION COLUMN

一行寫(xiě)出javascript函數(shù)式編程中的curry

Jackwoo / 1225人閱讀

摘要:我們終于寫(xiě)完了這個(gè)神奇的函數(shù),它真的很強(qiáng)大,配合,那真是一個(gè)字,爽。

最近在學(xué)習(xí)javascript函數(shù)式編程,對(duì)其中大名鼎鼎的curry十分感興趣,curry函數(shù)可以接受一個(gè)函數(shù),我們暫且稱之為原始函數(shù),返回的也是一個(gè)函數(shù),柯里化函數(shù),這個(gè)返回的柯里化函數(shù)功能十分強(qiáng)大,他在執(zhí)行的過(guò)程中,不斷的返回一個(gè)貯存了傳入?yún)?shù)的函數(shù),直到觸發(fā)了原始函數(shù)執(zhí)行的條件。這么說(shuō)比較概括,那么就舉個(gè)例子來(lái)說(shuō)明一下:

原始函數(shù):

    var add = (x, y) => x + y

柯里化函數(shù):

    var curryAdd = curry(add)

這個(gè)add需要兩個(gè)參數(shù),但是我們的curryAdd執(zhí)行可以傳入更少的參數(shù),當(dāng)傳入的參數(shù)少于add需要的參數(shù)的時(shí)候,add函數(shù)并不會(huì)執(zhí)行,curryAdd就會(huì)將這個(gè)參數(shù)記下來(lái),并且返回另外一個(gè)函數(shù),這個(gè)函數(shù)可以繼續(xù)執(zhí)行傳入?yún)?shù),我們會(huì)有一個(gè)變量專門記錄傳入?yún)?shù)的情況,如果傳入?yún)?shù)的總數(shù)等于add需要參數(shù)的總數(shù),我們就激活了原始參數(shù)執(zhí)行,就會(huì)返回我們想要的結(jié)果。

    // 此時(shí)只傳入了一個(gè)參數(shù) 根據(jù)判斷返回的是一個(gè)函數(shù)
    var add2 = curryAdd(2)
    // add2 = function(...) {}
    // 此時(shí)累計(jì)傳入了兩個(gè)參數(shù) 等于了add需要參數(shù)的總和 所以返回的是一個(gè)結(jié)果
    // 相當(dāng)于執(zhí)行了add(2)(3)
    var result = add2(3)
    // result = 5

還是很不錯(cuò)的是吧,好吧,我們的目的是為了寫(xiě)出這個(gè)神奇curry函數(shù),而且還要一行寫(xiě)出來(lái),不要著急,先分析一下怎么去寫(xiě),然后再一步步的優(yōu)化。

那根據(jù)上面的描述,我們看一下curry函數(shù)需要什么,首先需要一個(gè)變量,用來(lái)存下來(lái)原始函數(shù)的參數(shù)個(gè)數(shù),我們知道function有一個(gè)屬性為length,對(duì)就是它,我們用limit存下來(lái)

    var curry = function(fn) {
         var limit = fn.length
         ...
    }

curry函數(shù)要返回一個(gè)函數(shù), 這個(gè)函數(shù)是要執(zhí)行的,那么問(wèn)題就是,我們要判斷這個(gè)函數(shù)的執(zhí)行是否激活了原始函數(shù)的執(zhí)行,問(wèn)題就出現(xiàn)在傳入的參數(shù)上面。返回函數(shù)還是結(jié)果?這的確是一個(gè)問(wèn)題,
我們先寫(xiě)返回結(jié)果的情況,當(dāng)傳入的參數(shù)等于原始函數(shù)需要的參數(shù)時(shí),我們執(zhí)行原始函數(shù)fn

    var curry = function(fn) {
         var limit = fn.length
         return function (...args) {
             if (args.length >= limit) {
                 return fn.apply(null, args)
             }
         }
    }

否則呢 我們就要返回一個(gè)貯存了參數(shù)的函數(shù),這里有兩點(diǎn),一是參數(shù)的傳入歷史我們要記錄下來(lái),二是這個(gè)返回的函數(shù)需要做些什么

    var curry = function(fn) {
         var limit = fn.length
         return function (...args) {
             if (args.length >= limit) {
                 return fn.apply(null, args)
             } else {
                 return function(...args2) {
                     
                 }
             }
         }
    }

看出來(lái)了吧 我們只需要把返回函數(shù)執(zhí)行的參數(shù)累加起來(lái)就達(dá)到了記錄參數(shù)傳入情況的目的,于是我們想到了concat 對(duì) args.concat(args2), 依次類推,我們返回的函數(shù)要做的就是重復(fù)做上面的事情,也就是參數(shù)為args的函數(shù)要做的事情,所以他需要一個(gè)名字,不然我們沒(méi)法執(zhí)行,我們叫它judgeCurry
所以正如我們所說(shuō)的,要么返回一個(gè)函數(shù),要么執(zhí)行原始函數(shù)。

    var curry = function(fn) {
         var limit = fn.length
         return function judgeCurry (...args) {
             if (args.length >= limit) {
                 return fn.apply(null, args)
             } else {
                 return function(...args2) {
                     return judgeCurry.apply(null, args.concat(args2))                                     
                 }
             }
         }
    }

我們終于寫(xiě)完了這個(gè)神奇的curry函數(shù),它真的很強(qiáng)大,配合compose,那真是一個(gè)字,爽。
我們的目的還是一行把上面那個(gè)函數(shù)寫(xiě)出來(lái),一行寫(xiě)?怎么寫(xiě)?對(duì)了,用ES6啊,于是一番折騰

    var currySingle = fn => judgeCurry = (...args) => args.length >= fn.length ? fn.apply(null, args) : (...args2) => judgeCurry.apply(null, args.concat(args2))

好,我們看一下哪有問(wèn)題,對(duì)了,就是我們?yōu)榱瞬挥胠imit參數(shù),用了就得賦值,賦值就不能一行搞定了,就會(huì)變成這樣

    var currySingle = fn => {
        var limit = fn.length
        var judgeCurry = null
        return judgeCurry = (...args) => args.length >= limit ? fn.apply(null, args) : (...args2) => judgeCurry.apply(null, args.concat(args2))
    }

需要判斷參數(shù)的時(shí)候不斷的對(duì)fn.length求值,但是fn.length的值是確定的,我們不想每次都求值,但又不想用limit怎么辦,有什么辦法呢?你一定想到了,立即執(zhí)行函數(shù)!!

    var currySingle = fn => ((limit) => judgeCurry = (...args) => args.length >= limit ? fn.apply(null, args) : (...args2) => judgeCurry.apply(null, args.concat(args2)))(fn.length)

不得不感嘆javascript的神奇,終于,我們就一行將這個(gè)神奇的curry寫(xiě)出來(lái)了。。。

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

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

相關(guān)文章

  • JavaScript函數(shù)編程,真香之組合(一)

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

    mengbo 評(píng)論0 收藏0
  • 翻譯連載 | 第 11 章:融會(huì)貫通 -《JavaScript輕量級(jí)函數(shù)編程》 |《你不知道的JS

    摘要:譯者團(tuán)隊(duì)排名不分先后阿希冬青蘿卜萌萌輕量級(jí)函數(shù)式編程第章融會(huì)貫通現(xiàn)在你已經(jīng)掌握了所有需要掌握的關(guān)于輕量級(jí)函數(shù)式編程的內(nèi)容?;仡^想想我們用到的函數(shù)式編程原則。這兩個(gè)函數(shù)組合成一個(gè)映射函數(shù)通過(guò),這就是融合見(jiàn)第章。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:...

    codeKK 評(píng)論0 收藏0
  • JavaScript函數(shù)編程(一)

    摘要:所以下面介紹一些函數(shù)式編程的知識(shí)和概念。函數(shù)式編程的一個(gè)明顯的好處就是這種聲明式的代碼,對(duì)于無(wú)副作用的純函數(shù),我們完全可以不考慮函數(shù)內(nèi)部是如何實(shí)現(xiàn)的,專注于編寫(xiě)業(yè)務(wù)代碼。我會(huì)在下一篇文章中介紹函數(shù)式編程的更加高階一些的知識(shí),例如等等概念。 一、引言 說(shuō)到函數(shù)式編程,大家可能第一印象都是學(xué)院派的那些晦澀難懂的代碼,充滿了一大堆抽象的不知所云的符號(hào),似乎只有大學(xué)里的計(jì)算機(jī)教授才會(huì)使用這些東...

    Shihira 評(píng)論0 收藏0
  • 掌握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
  • ES6函數(shù)與Lambda演算

    摘要:高階函數(shù)函數(shù)式編程中,接受函數(shù)作為參數(shù),或者返回一個(gè)函數(shù)作為結(jié)果的函數(shù)通常就被稱為高階函數(shù)。均屬于高階函數(shù),高階函數(shù)并不神秘,我們?nèi)粘>幊桃矔?huì)用到。參考演算函數(shù)式編程指南入門康托爾哥德?tīng)枅D靈永恒的金色對(duì)角線原文函數(shù)與演算 緣起 造了一個(gè)輪子,根據(jù)GitHub項(xiàng)目地址,生成項(xiàng)目目錄樹(shù),直觀的展現(xiàn)項(xiàng)目結(jié)構(gòu),以便于介紹項(xiàng)目。歡迎Star。 repository-tree 技術(shù)棧: ES6 ...

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

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

0條評(píng)論

閱讀需要支付1元查看
<