完完全全把函數(shù)式編程寫出來有點扛不住洲敢,很多也都用不上降铸,聊聊比較常見的鏈?zhǔn)讲僮鞅∩叮覍︽準(zhǔn)讲僮鞯囊恍├斫狻?/p>
先上一段代碼讓大家知道鏈?zhǔn)绞鞘裁礃拥模?code>$("#idName").show().css("color","red")镊屎,
鏈?zhǔn)秸{(diào)用的代表:Jquery
链瓦,使用過Jquery
的攻城獅們應(yīng)該都深有感觸,連式操作是Jquery
最具魅力的亮點之一熟妓。如果你還沉迷其中而沒時間掀開它神秘的小褲褲雪猪,那接下來,嘿嘿···
?鏈?zhǔn)讲僮鞯娜w
- 能夠進(jìn)行鏈?zhǔn)讲僮鞯膶ο螅烘準(zhǔn)綄ο?
chainObject
- 鏈?zhǔn)綄ο笊夏苓M(jìn)行鏈?zhǔn)讲僮鞯姆椒ǎ烘準(zhǔn)椒椒?code>chainToDo()
- 鏈?zhǔn)讲僮髯罱K想要獲得結(jié)果是通過被操作數(shù)據(jù):鏈?zhǔn)綌?shù)據(jù)
chainData
以下是一個簡單的鏈?zhǔn)讲僮鞔a滑蚯,我們在此基礎(chǔ)上慢慢講解浪蹂,慢慢優(yōu)化
var chainObject = {
chainData: 1,
chainToDo: function(){
this.chainData += 1;
return this
}
}
chainObject.chainToDo().chainToDo();
console.log(chainObject.chainData);
?鏈?zhǔn)綄ο?code>chainObject
鏈?zhǔn)讲僮鞯妮d體,鏈?zhǔn)綄ο笫且粋€屬性及方法的集合告材,特別的地方在于chainObject
在每次調(diào)用一個方法(chainObject.chainToDo
)時坤次,這個方法都會return
出chainObject
對象本身,這個對象又具有執(zhí)行同樣操作的方法斥赋,如此循環(huán),于是形成了我們想要的函數(shù)執(zhí)行鏈條chainObject.chainToDo().chainToDo().chainToDo()···
疤剑。
♂鏈?zhǔn)椒椒?code>chainToDo()
在上面的例子函數(shù)中滑绒,我們最終想要獲知chainObject.chainData
的最終值,鏈?zhǔn)讲僮魇强梢粤税欤恳淮魏〞沉芾斓牟僮骱笠晒剩€得打掃戰(zhàn)場,就很不愉快了弯菊。
于是鏈?zhǔn)椒椒ㄗ菔疲覀兛梢詢?yōu)化為兩種
-
nextTodo
:可以返回對象本身return this
的方法,可進(jìn)行下一步操作 -
endDo
:可以想要的結(jié)果return this.chainData
的方法管钳,由于返回的是對象自帶的數(shù)據(jù)钦铁,而不是對象本身,無法繼續(xù)鏈?zhǔn)讲僮鞑牌幔準(zhǔn)讲僮鹘Y(jié)束牛曹,是作為鏈?zhǔn)讲僮鹘K止符的存在。
var chainObject = {
chainData: 1,
chainToDo: function(){
this.chainData += 1;
return this
},
chainEndDo : function(){
return this.chainData
}
}
var resultData = chainObject.chainToDo().chainToDo().chainEndDo();//獲取最終結(jié)果數(shù)據(jù)
?鏈?zhǔn)綌?shù)據(jù)chainData
鏈?zhǔn)讲僮鞯臉蛄海?code>chainData作為媒介一樣的東西醇滥,讓每次鏈?zhǔn)讲僮鞫季哂幸饬x黎比,因為鏈?zhǔn)椒椒ㄖ械?code>nextTodo每次都是返回一個可供下次操作的對象,如果沒有這么一個媒介腺办,鏈?zhǔn)秸{(diào)用可能只是一長串無意義的函數(shù)串焰手。
這個媒介可以是在對象字面量中,也可以是在上一級的作用域中怀喉,
?基于JS原型鏈的鏈?zhǔn)讲僮鲀?yōu)化
JS原型鏈搭配鏈?zhǔn)讲僮鳎覀兛梢院芊奖愕脑谝活悓ο笊蠌?fù)用船响,只需要如下代碼
var ChainObject
ChainObject.prototype = {
chainData: 1,
chainToDo: function(){
this.chainData += 1;
return this
},
chainEndDo : function(){
return this.chainData
}
}
var obj = new ChainObject
var resultData = obj.chainToDo().chainToDo().chainEndDo();//獲取最終結(jié)果數(shù)據(jù)
每個實例都可以使用相同的鏈?zhǔn)椒椒ǎ?br>
其實我們常見的map
,filter
等一些數(shù)組方法躬拢,本來就是可以進(jìn)行鏈?zhǔn)讲僮鳎?/p>
var arr = [1,2,3,4] ;
arrData = arr.map((item)=>{retrun item*2})
.filter()
.reduce()
map
,filter
都返回了一個新的數(shù)組躲履,而只要是數(shù)組都具有原生的方法。
?使用情況分析
學(xué)到一種新的技術(shù)聊闯,可能總會出現(xiàn)工猜,學(xué)了沒法用,或者學(xué)了過段時間又忘記的情況菱蔬。如果讀了這篇文章后篷帅,覺得還是很有用,希望接下來拴泌,帶著一些疑惑魏身,思考一下我們?nèi)绻谧约旱拇a中使用,讓自己寫的代碼更優(yōu)雅蚪腐。
常見的函數(shù)function(){return a+1}
,分解為兩個函數(shù)箭昵,一個用來計算,一個用來返回結(jié)果回季,如果將兩個函數(shù)掛在到一個鏈?zhǔn)綄ο笊霞抑疲鋵嵕褪且粋€簡單的兩步鏈?zhǔn)秸{(diào)用obj.addData().getResult()
。結(jié)果就是泡一,不是鏈?zhǔn)秸{(diào)用在什么情況下使用颤殴,而是你想在什么地方使用鏈?zhǔn)秸{(diào)用。
使用鏈?zhǔn)秸{(diào)用時鼻忠,一般要考慮的是涵但,處理步驟較為復(fù)雜的的事物,鏈?zhǔn)秸{(diào)用能夠讓我們清楚的知道要做什么以及下一步將要做什么粥烁。將復(fù)雜的邏輯調(diào)理化