jQuery 原始碼分析筆記 3

2022-01-26 04:35:28 字數 2308 閱讀 6602

###deferred機制

從1.5版本開始,jquery加入了deferred功能,讓事件處理佇列更加的完善。並用

這個機制重寫了ajax模組。雖然還沒輪到ajax,但是接下來的事件處理函式中牽扯到了

這個機制,所以提前看這段**。

deferred把**函式註冊到乙個佇列中,統一管理,並且可以同步或者非同步地呼叫

這些函式。jquery.deferred()用來構造乙個deferred物件。該物件有狀態值,共有三種:

rejected, resolved和初始狀態。其中resolved表示該操作成功完成了,而rejected

則表示出現了錯誤,呼叫失敗。deferred物件的主要成員如下:

* done(callback): 註冊乙個callback函式,當狀態為resolved時被呼叫。

* fail(callback): 註冊乙個callback函式,當狀態為rejected時被呼叫。

* always(callback): 註冊乙個callback函式,無論是resolved或者rejected都會被

呼叫。* then(successcallback, failurecallback): 同時傳入成功和失敗的**函式。

* pipe(successfilter, failurefilter): 在呼叫成功和失敗的**函式前先呼叫pipe

指定的函式。算是一種管道機制,攔截了函式呼叫。

* resolve(args): 把狀態設定為resolved。

* reject(args): 把狀態設定為rejected。

* promse(): 返回的是乙個不完整的deferred的介面,沒有resolve和reject。即不能

修改deferred物件的狀態。可以看作是一種唯讀檢視。這是為了不讓外部函式提早觸發

**函式。比如$.ajax在1.5版本後不再返回xmlhttprequest,而是返回乙個封裝了

xmlhttprequest和deferred物件介面的object。其中deferred部分就是promise()得到

的,這樣不讓外部函式呼叫resolve和reject,防止在ajax完成前觸發**函式。把這

兩個函式的呼叫許可權保留給ajax內部。

這個模組的**從939行開始,緊接著jquery物件的宣告。也算是乙個基礎核心**了。

同時也是1.5版本最大的變化之一。

實際上resolve和reject的**邏輯是一樣的,只是對應的狀態不同而已。為了**復用,

內部先實現了乙個\_deferred,然後真正的deferred內部new了兩個\_deferred,乙個作為

resolve,另乙個作為reject。

\_deferred物件內部維護了乙個函式陣列(callback list)。done(f1, f2...)的工作

就是把這些callback依次push到這個佇列中儲存下來。而resolvewith(帶參的resolve)

和resolve依次呼叫這寫callback函式。

done中,需要判斷事件是否已經完成。如果callback加入chain時事件已經完成,則

需要馬上執行callback。這個特性是讓callback不用再和觸發非同步事件宣告寫在一起

的原因。比如原來必須寫$.post("...", function(data) )。這個success

callback必須寫在這裡,而現在可以寫:

var defer = $.post("...");

// ...

defer.success(function(data) );

// ...

defer.fail(function(data) );

這樣非同步事件的宣告和**函式就可以分別管理了。這是1.5版本重寫後的最大變化。

pipe(successfilter, failurefilter)函式修改了原來物件中的callback list。在兩個callback

list前面用then函式分別插入了filter函式。然後返回。這樣當這個deferred物件的狀態變化時,會

先呼叫pipe函式指定的filter函式,然後才會呼叫callback list。

promise()則單純許多,就是new乙個新object,然後把需要的成員copy進去。這個需要的成員定義在

乙個叫promisemethods常量中。

var promisemethods = "done fail isresolved isrejected promise then always pipe".split(" ");
ps: 今天把markdown環境配置好後,用vim編寫markdown,然後複製過來直接發布。感覺不錯

jQuery 原始碼分析筆記 6

jquery.data data模組 是乙個比較有趣的功能,可以為任意的element 新增額外的資料。而且處理了迴圈引用和記憶體洩漏的問題。api非常簡單,就是.data key,value 用來儲存,data key 用開查詢資料。data部分的 從1381行開始。最開始的幾行關鍵 jquery...

jQuery原始碼分析

工具 版本說明 版本號備註 jquery 2.1.1 sublime 3jquery function selector,context jquery.fn jquery.prototype 快速匹配正則 不加g 不光匹配整體項還會匹配到子項 rquickexpr s w w w init jque...

jQuery原始碼分析

一 jquery如何做到不汙染變數名並暴露出 供使用者使用 jquery將變數和 寫進立即執行函式,通過函式來包裹所有的變數和方法,再在這個立即執行函式上將 jquery方法繫結到window上,就可以讓使用者使用到jq方法了。二 jquery是如何做到 jquery 的?function wind...