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