課程
/前端開(kāi)發(fā)
/jQuery
/jQuery源碼解析(架構(gòu)與依賴(lài)模塊)
?46行,deferred[tuple[0] + "With"] = list.fireWith;
上面的list是從哪里來(lái)的啊,貌似沒(méi)有定義啊
2015-05-25
源自:jQuery源碼解析(架構(gòu)與依賴(lài)模塊) 5-4
正在回答
慕課上由于課程的關(guān)系,有些地方可能需要看源碼,沒(méi)有很細(xì)的深入:
摘自我正在寫(xiě)的書(shū)(jQuery框架設(shè)計(jì)與實(shí)現(xiàn))部分解釋?zhuān)?/p>
? ? jQuery在代碼上的設(shè)計(jì),最喜歡的就是合并很多相似功能的代碼,達(dá)到省代碼量的目的。deferred對(duì)象中有很多的方法,但是實(shí)際上在定義的部分jQuery并沒(méi)有一個(gè)一個(gè)指定接口與對(duì)應(yīng)方法。Deferred方法中定義了一個(gè)數(shù)據(jù)元組集, 每個(gè)元組分別包含一些與當(dāng)前deferred相關(guān)的信息。
? ? ?deferred相關(guān)的數(shù)據(jù)元組集:這是一個(gè)很有抽象的合并設(shè)計(jì),promise規(guī)范指明了內(nèi)部會(huì)有三個(gè)狀態(tài)成功、失敗、進(jìn)行中,通過(guò)指定的方法來(lái)修改這些狀態(tài),那么我們?cè)诤喜⒌臅r(shí)候可以把同類(lèi)狀態(tài)與方法都寫(xiě)到一個(gè)數(shù)組中,就出現(xiàn)了這樣的一種合并設(shè)計(jì)了。
var?tuples?=?[ ?????????["resolve",?"done",?jQuery.Callbacks("once?memory"),?"resolved"], ?????????["reject",?"fail",?jQuery.Callbacks("once?memory"),?"rejected"], ?????????["notify",?"progress",?jQuery.Callbacks("memory")] ]
每一組數(shù)組集,代表的意思:
1.觸發(fā)回調(diào)函數(shù)列表執(zhí)行(函數(shù)名), 2.添加回調(diào)函數(shù)(函數(shù)名) 3.回調(diào)函數(shù)列表(jQuery.Callbacks對(duì)象) 4.deferred最終狀態(tài)(第三組數(shù)據(jù)除外)
如何使用?我們通過(guò)循環(huán)取出每個(gè)數(shù)組中的定義,然后賦給不同的對(duì)象去操作,這里定義2個(gè)對(duì)象 一個(gè)promise,一個(gè)deferred。
var?promise?=?{},deferred?=?{}; for?(var?i?=?0;?i?<?tuples.length;?i++)?{ ?????????var?triggerName??=?tuples[i][0]?//觸發(fā)器方法?resolve、reject、notify ?????????var?callbackName?=?tuples[i][1]?//監(jiān)聽(tīng)的回調(diào)?done、fail、progress ?????????var?operate??????=?tuples[i][2]?//具體操作的方法?callback對(duì)象 ?????????var?statusName???=?tuples[i][3]?//狀態(tài)值?resolved、rejected ? ?????????//給promise上附加done、fail、progress, ?????????//對(duì)應(yīng)的回調(diào)用callback.add保存 ?????????promise[?callbackName?]?=?operate.add; ? ?????????//觸發(fā)方法 ?????????//?resolve、reject、reject ?????????deferred[?triggerName?]?=?function()?{ ???????????????????deferred[?triggerName+?"With"?](?this?===?deferred???promise?:?this,?arguments?); ???????????????????return?this; ?????????}; ?????????//resolveWith、rejectWith、rejectWith ?????????deferred[triggerName?+?"With"?]?=?operate.fireWith; }
循環(huán)數(shù)據(jù)元組集,然后把接口與方法都混入到了對(duì)應(yīng)的deferred與promise對(duì)象上了
? ? ? ? promise與deferred對(duì)象上對(duì)應(yīng)的方法就是jQuery針對(duì)Promise規(guī)范的一種擴(kuò)展,但是核心來(lái)說(shuō)都是基于回調(diào)模式,jQuery就抽出了一個(gè)jQuery.Callbacks是模塊專(zhuān)門(mén)來(lái)處理這種回調(diào)邏輯。done|faile|progress 就是Callbacks.add方法增加一個(gè)監(jiān)聽(tīng)函數(shù), resolve、reject、notify就是觸發(fā)對(duì)應(yīng)的回調(diào),通過(guò)Callbacks. fireWith來(lái)處理。
它沒(méi)寫(xiě)全吧···我去看的源碼 jquert-2.0.0.js 里是這樣寫(xiě)的 #前面還有一些代碼,有定義設(shè)置list#
//?Add?list-specific?methods jQuery.each(?tuples,?function(?i,?tuple?)?{ var?list?=?tuple[?2?], stateString?=?tuple[?3?]; //?promise[?done?|?fail?|?progress?]?=?list.add promise[?tuple[1]?]?=?list.add; //?Handle?state if?(?stateString?)?{ list.add(function()?{ //?state?=?[?resolved?|?rejected?] state?=?stateString; //?[?reject_list?|?resolve_list?].disable;?progress_list.lock },?tuples[?i?^?1?][?2?].disable,?tuples[?2?][?2?].lock?); } //?deferred[?resolve?|?reject?|?notify?] deferred[?tuple[0]?]?=?function()?{ deferred[?tuple[0]?+?"With"?](?this?===?deferred???promise?:?this,?arguments?); return?this; }; deferred[?tuple[0]?+?"With"?]?=?list.fireWith; });
舉報(bào)
由淺入深地剖析jQuery庫(kù)的設(shè)計(jì)與實(shí)現(xiàn),揭開(kāi)框架背后的秘密
2 回答arguments.callee(List)參數(shù)問(wèn)題
2 回答List是不是多余?
1 回答這個(gè)代碼寫(xiě)在哪兒啊
4 回答callback怎么來(lái)的?
2 回答閉包處理的很給力啊
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢(xún)優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2015-05-26
慕課上由于課程的關(guān)系,有些地方可能需要看源碼,沒(méi)有很細(xì)的深入:
摘自我正在寫(xiě)的書(shū)(jQuery框架設(shè)計(jì)與實(shí)現(xiàn))部分解釋?zhuān)?/p>
? ? jQuery在代碼上的設(shè)計(jì),最喜歡的就是合并很多相似功能的代碼,達(dá)到省代碼量的目的。deferred對(duì)象中有很多的方法,但是實(shí)際上在定義的部分jQuery并沒(méi)有一個(gè)一個(gè)指定接口與對(duì)應(yīng)方法。Deferred方法中定義了一個(gè)數(shù)據(jù)元組集, 每個(gè)元組分別包含一些與當(dāng)前deferred相關(guān)的信息。
? ? ?deferred相關(guān)的數(shù)據(jù)元組集:這是一個(gè)很有抽象的合并設(shè)計(jì),promise規(guī)范指明了內(nèi)部會(huì)有三個(gè)狀態(tài)成功、失敗、進(jìn)行中,通過(guò)指定的方法來(lái)修改這些狀態(tài),那么我們?cè)诤喜⒌臅r(shí)候可以把同類(lèi)狀態(tài)與方法都寫(xiě)到一個(gè)數(shù)組中,就出現(xiàn)了這樣的一種合并設(shè)計(jì)了。
每一組數(shù)組集,代表的意思:
如何使用?我們通過(guò)循環(huán)取出每個(gè)數(shù)組中的定義,然后賦給不同的對(duì)象去操作,這里定義2個(gè)對(duì)象 一個(gè)promise,一個(gè)deferred。
循環(huán)數(shù)據(jù)元組集,然后把接口與方法都混入到了對(duì)應(yīng)的deferred與promise對(duì)象上了
? ? ? ? promise與deferred對(duì)象上對(duì)應(yīng)的方法就是jQuery針對(duì)Promise規(guī)范的一種擴(kuò)展,但是核心來(lái)說(shuō)都是基于回調(diào)模式,jQuery就抽出了一個(gè)jQuery.Callbacks是模塊專(zhuān)門(mén)來(lái)處理這種回調(diào)邏輯。done|faile|progress 就是Callbacks.add方法增加一個(gè)監(jiān)聽(tīng)函數(shù), resolve、reject、notify就是觸發(fā)對(duì)應(yīng)的回調(diào),通過(guò)Callbacks. fireWith來(lái)處理。
2015-05-26
它沒(méi)寫(xiě)全吧···我去看的源碼 jquert-2.0.0.js 里是這樣寫(xiě)的 #前面還有一些代碼,有定義設(shè)置list#