簡述幾個很是有用的柯里化函數使用場景

使用場景之一:減小重複傳遞不變的部分參數
lodash.curryhtml

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

上面這個函數是將三個參數生成一個完成的url.調用以下:git

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

而後你會發現,前兩個參數保持不變,但每次調用都須要傳遞。因此能夠對其優化,僅傳遞最後一個變化的參數。
一般咱們第一個想法是將函數改爲以下:github

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

可是仍是有點缺陷,若是這個庫函數有被其它人使用呢,這種狀況下基本上是不容許直接改庫函數的。而且若是後期還須要處理https的請求呢。難道再把第一個參數加回去?這樣別人若使用了該庫函數也要修改調用代碼。
針對這種狀況,使用柯里化函數能夠完美解決。
使用lodash.curry庫函數使函數柯里化dom

// 避免每次調用重複傳參
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參數傳遞給map, filter等函數。函數

好比咱們有這樣一段數據:優化

var persons = [{name: 'kevin', age: 11}, {name: 'daisy', age: 24}]
若是咱們要獲取全部的 name 值,咱們通常會這樣實現:url

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

咱們能夠利用柯里化改寫成以下:code

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

咱們爲了獲取 name 屬性還要再編寫一個 getProp 函數,是否是又麻煩了些?htm

可是請注意,getProp 函數編寫一次後,之後能夠屢次使用,實際上代碼從本來的三行精簡成了一行,並且你看代碼是否是更加易懂了?
demo:get

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柯里化以後,就能實現callback的複用了,並且很是靈活,這樣不須要每次map計算都新寫一個匿名函數,並在回調里加上特有的邏輯,致使其沒法重用。

從上面的例子中還能夠看出,不管想要獲取抽取出哪一個屬性值,只要這要寫person.map(getProp('propertyname_xxx'))就能夠輕鬆獲取了。

總結:柯里化這個概念以及實現自己都很是難懂,平時寫代碼幾乎也不多使用,能使用的場景真的不太多,大多數狀況都選擇了其它簡單的方式實現了。在get到這個技能後,我認爲之後能夠在項目中適當使用這個方法,儘可能減小重複代碼。目前只研究了這麼些,至於其它的好處和使用場景後期有機會再更新。

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

相關文章
相關標籤/搜索