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

資訊專欄INFORMATION COLUMN

簡述幾個非常有用的柯里化函數(shù)使用場景

wanglu1209 / 2922人閱讀

摘要:難道再把第一個參數(shù)加回去這樣別人若使用了該庫函數(shù)也要修改調(diào)用代碼。使用庫函數(shù)使函數(shù)柯里化避免每次調(diào)用重復(fù)傳參使用場景將柯里化后的參數(shù)傳遞給等函數(shù)。

使用場景之一:減少重復(fù)傳遞不變的部分參數(shù)
lodash.curry

function simpleURL(protocol, domain, path) {
    return protocol + "://" + domain + "/" + path;
}

上面這個函數(shù)是將三個參數(shù)生成一個完成的url.調(diào)用如下:

var myurl = simpleURL("http", "mysite", "home.html");
var myurl2 = simpleURL("http", "mysite", "aboutme.html");

然后你會發(fā)現(xiàn),前兩個參數(shù)保持不變,但每次調(diào)用都需要傳遞。所以可以對其優(yōu)化,僅傳遞最后一個變化的參數(shù)。
通常我們第一個想法是將函數(shù)改成如下:

function simpleURL(path) {
   return "http://mysite/" + path;
}

但是還是有點(diǎn)缺陷,如果這個庫函數(shù)有被其它人使用呢,這種情況下基本上是不允許直接改庫函數(shù)的。并且如果后期還需要處理https的請求呢。難道再把第一個參數(shù)加回去?這樣別人若使用了該庫函數(shù)也要修改調(diào)用代碼。
針對這種情況,使用柯里化函數(shù)可以完美解決。
使用lodash.curry庫函數(shù)使函數(shù)柯里化

// 避免每次調(diào)用重復(fù)傳參
let myURL1 = _.curry(simpleURL)("https", "mysite");
let res1 = myURL1("home.html");    //

console.log(res1);//https://mysite/home.html

let myURL2 = _.curry(simpleURL)("http", "mysite");
let res2 = myURL2("aboutme.html");    //

console.log(res2);//http://mysite/aboutme.html

使用場景2:將柯里化后的callback參數(shù)傳遞給map, filter等函數(shù)。

比如我們有這樣一段數(shù)據(jù):

var persons = [{name: "kevin", age: 11}, {name: "daisy", age: 24}]
如果我們要獲取所有的 name 值,我們一般會這樣實現(xiàn):

var names = persons.map(function (item) {
    return item.name;
});

我們可以利用柯里化改寫成如下:

var getProp = _.curry(function (key, obj) {
    return obj[key]
});
var names = persons.map(getProp("name"))

我們?yōu)榱双@取 name 屬性還要再編寫一個 getProp 函數(shù),是不是又麻煩了些?

但是請注意,getProp 函數(shù)編寫一次后,以后可以多次使用,實際上代碼從原本的三行精簡成了一行,而且你看代碼是不是更加易懂了?
demo:

var persons = [{name: "kevin", age: 11}, {name: "daisy", age: 24}]

let getProp = _.curry(function (key, obj) {
    return obj[key]
});
let names2 = persons.map(getProp("name"))
console.log(names2); //["kevin", "daisy"]

let ages2 = persons.map(getProp("age"))
console.log(ages2); //[11,24]

在這個場景中,將callback柯里化之后,就能實現(xiàn)callback的復(fù)用了,而且非常靈活,這樣不需要每次map計算都新寫一個匿名函數(shù),并在回調(diào)里加上特有的邏輯,導(dǎo)致其無法重用。

從上面的例子中還可以看出,無論想要獲取抽取出哪個屬性值,只要這要寫person.map(getProp("propertyname_xxx"))就可以輕松獲取了。

總結(jié):柯里化這個概念以及實現(xiàn)本身都非常難懂,平時寫代碼幾乎也很少使用,能使用的場景真的不太多,大多數(shù)情況都選擇了其它簡單的方式實現(xiàn)了。在get到這個技能后,我認(rèn)為以后可以在項目中適當(dāng)使用這個方法,盡量減少重復(fù)代碼。目前只研究了這么些,至于其它的好處和使用場景后期有機(jī)會再更新。

參考1: https://www.jianshu.com/p/9b6...
參考2:https://github.com/mqyqingfen...

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

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

相關(guān)文章

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

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

    mengbo 評論0 收藏0
  • 高級函數(shù)技巧-函數(shù)柯里

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

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

    摘要:函數(shù)被轉(zhuǎn)化之后得到柯里化函數(shù),能夠處理的所有剩余參數(shù)。因此柯里化也被稱為部分求值。那么函數(shù)的柯里化函數(shù)則可以如下因此下面的運(yùn)算方式是等價的。而這里對于函數(shù)參數(shù)的自由處理,正是柯里化的核心所在。額外知識補(bǔ)充無限參數(shù)的柯里化。 showImg(https://segmentfault.com/img/remote/1460000008493346); 柯里化是函數(shù)的一個比較高級的應(yīng)用,想要...

    kk_miles 評論0 收藏0
  • JavaScript 函數(shù)式編程(二)

    摘要:注意是單一參數(shù)柯里化是由以邏輯學(xué)家命名的,當(dāng)然編程語言也是源自他的名字,雖然柯里化是由和發(fā)明的。辨別類型和它們的含義是一項重要的技能,這項技能可以讓你在函數(shù)式編程的路上走得更遠(yuǎn)。 slide 地址 三、可以,這很函數(shù)式~ showImg(https://segmentfault.com/img/remote/1460000015978685?w=187&h=160); 3.1.函數(shù)是一...

    thursday 評論0 收藏0
  • 掌握J(rèn)avaScript函數(shù)柯里

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

    DTeam 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<