使用場景之一:減小重複傳遞不變的部分參數
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...