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