- 前言:我們先要了解下柯里化的概念,什么是柯里化,他可以干什么,好處是什么,要知其然,也要知其所以然。
- 自夸一句,小哥哥就是這樣的學(xué)習(xí)習(xí)慣 - 喜歡刨根問(wèn)底
- 先來(lái)了解下柯里化的概念
- 扯犢子,你跟我說(shuō)什概念,告訴我怎么用就ok了,sorry,這叫職業(yè)素養(yǎng)。概念必須要清楚。
- 維基百科對(duì)于柯里化的概念我就不粘貼了,省的邊人說(shuō)我不說(shuō)人話。
- 在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中,柯里化:是一種將使用多個(gè)參數(shù)的一個(gè)函數(shù) 轉(zhuǎn)換成一系列使用一個(gè)參數(shù)的函數(shù)的技術(shù)。
- 概念清楚了,老規(guī)矩,分析分析需求。
- 關(guān)鍵字:多個(gè)參數(shù)的函數(shù),fn(x1,x2,x3...){} 這樣唄
- 關(guān)鍵字:轉(zhuǎn)換成一系列一個(gè)參數(shù)的函數(shù)
- var fn1 = curry(add, 1)
- var fn2 = curry(fn1, 2)
- var fn3 = curry(fn2, 3)
- var fn4 = curry(fn3, 4)
- ....
- 開(kāi)擼
//小哥哥,先的有一個(gè)多個(gè)參數(shù)的函數(shù) function add(a,b,c,d){ return a + b + c + d } //然后我們?cè)诜庋b一個(gè)柯里化函數(shù) function currying(fn){ let _outArgs = [].slice.call(arguments,1) return function(){ let _innArgs = [].slice.call(arguments,0) return fn.apply(null, _outArgs.concat(_innArgs)); } } // 轉(zhuǎn)換成一些列一個(gè)函數(shù)的參數(shù) var fn1 = currying(add, 1) var fn2 = currying(fn1, 2) var fn3 = currying(fn2, 3) var fn4 = currying(fn3, 4) console.log(test4Curry())//10 大功告成,這就是柯里化
- 小哥哥我不想要上邊的樣子,我想讓他自動(dòng)檢測(cè)參數(shù)夠了自動(dòng)執(zhí)行,好說(shuō)好說(shuō)....。
- 面試官小哥哥老讓我實(shí)現(xiàn)這樣的功能 currying(1)(2)(3)
- 這就屬于應(yīng)用柯里化了
function add(a,b,c,d){ return a + b + c + d } function currying(fn){ let _outArgs = [].slice.call(arguments,1) return function(){ let _innArgs = [].slice.call(arguments,0) return fn.apply(null, _outArgs.concat(_innArgs)); } } function useCurrying(){ //拿到真正執(zhí)行函數(shù)需要的參數(shù)的長(zhǎng)度,檢測(cè)到參數(shù)夠了自動(dòng)執(zhí)行 var length = length || fn.length return function(){ //參數(shù)不夠,返回一個(gè)函數(shù) if(arguments.length < length){ var combined = [fn].concat([].slice.call(arguments,0)) return curry(curring.apply(this,combined),length - arguments.length) }else{ //參數(shù)夠了給我執(zhí)行,歐力給 return fn.apply(this,arguments) } } } let useCurry = useCurrying(add) useCurry(1)(2)(3)(4) useCurry(1,2)(3)(4) useCurry(1,2,3)(4) //..... 都是10 歐力給,沒(méi)毛病。這種寫法是不是很騷,哈哈
- 小哥哥,上邊這個(gè)柯里化的應(yīng)用太簡(jiǎn)單了,能不能說(shuō)一個(gè)我們項(xiàng)目中經(jīng)常用到的。好多好說(shuō)....
- 那就來(lái)封裝個(gè)ajax的例子吧。
function Ajax() { //小哥哥,ie下這樣是得不到httpRequest對(duì)象的,ie兼容的問(wèn)題咱就不考慮了 this.xhr = new XMLHttpRequest(); } //有逼格一點(diǎn),原型鏈編程 Ajax.prototype.open = function(type, url, data, callback) { this.onload = function() { callback(this.xhr.responseText, this.xhr.status, this.xhr); } this.xhr.open(type, url, data.async); this.xhr.send(data.paras); } let methods = "get post" //option,delete...那些方法,按下不表 methods.split(' ').forEach(function(item) { Ajax.prototype[item] = currying(Ajax.prototype.open, item); }); // 這樣用起來(lái)是不是很爽.... var xhr = new Ajax(); xhr.get('/articles/list.php', {}, function(data) { //自己的業(yè)務(wù)邏輯 }); // 在爽一下..... var xhr1 = new Ajax(); xhr1.post('/articles/add.php', {}, function(data) { //自己的業(yè)務(wù)邏輯 });
- 進(jìn)入尾聲了,我們總結(jié)下柯里化的好處
- 前端使用柯理化的用途主要就應(yīng)該是簡(jiǎn)化代碼結(jié)構(gòu),提高系統(tǒng)的維護(hù)性,一個(gè)方法,只有一個(gè)參數(shù),強(qiáng)制了功能的單一性,很自然 就做到了功能內(nèi)聚,降低耦合
- 柯理化的優(yōu)點(diǎn)就是降低代碼的重復(fù),提高代碼的適應(yīng)性
- 后記,柯里化的應(yīng)用場(chǎng)景還有很多很多,記住合適的才是做好的,脫離了業(yè)務(wù)邏輯的技術(shù)都是耍流氓。今天的柯里化就分享到這里
學(xué)海無(wú)涯,沒(méi)有最強(qiáng),只有更強(qiáng),有錯(cuò)誤的地方希望大家指出,理解不到位的地方,也希望大家指出.....。
javaScript之 柯里化
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
推薦閱讀更多精彩內(nèi)容
- "use strict";function _classCallCheck(e,t){if(!(e instanc...
- 原文鏈接 Haskell和scala都支持函數(shù)的柯里化,JavaScript函數(shù)的柯里化還與JavaScript的...
- 三、閉包和高階函數(shù) 3.1 閉包 3.1.1 變量的作用域 所謂變量的作用域,就是變量的有效范圍。通過(guò)作用域的劃分...
- 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
- 你覺(jué)得js是一門怎樣的語(yǔ)言,它與你學(xué)過(guò)的其他語(yǔ)言有什么不同 變量類型 js如何判斷變量數(shù)據(jù)類型 dom節(jié)點(diǎn)獲取,及...