jQuery 原始碼分析筆記 6

2022-01-26 04:35:27 字數 2078 閱讀 7354

###jquery.data

[data模組](是乙個比較有趣的功能,可以為任意的element

新增額外的資料。而且處理了迴圈引用和記憶體洩漏的問題。

api非常簡單,就是.data(key, value)用來儲存,.data(key)用開查詢資料。

data部分的**從1381行開始。最開始的幾行關鍵**:

jquery.extend(,

// 分配id用的seed

uuid: 0,

// 為了區別不同的jquery例項儲存的資料,使用字首+jquery版本號+隨機數作為key

expando: "jquery" + (jquery.fn.jquery + math.random()).replace(/\d/g, ""),

nodata:

});

對外的介面都呼叫了兩個內部函式:jquery.data(elem, name, data, pvt)和jquery.removedata(elem, name, pvt)。

而removedata的邏輯與data類似,只是data是加入資料,而removedata使用delete或者設定為null刪除資料。

data部分的**中明確區分了js物件和dom物件的儲存,這是為了解決部分瀏覽器的記憶體洩漏問題。

在低版本ie中,當dom和js物件之間出現迴圈引用時,gc就無法正確處理。參見[understanding and solving internet explorer leak patterns](

至於com物件,因為已經限制object元素沒有data,就繞過了這個問題。

data: function(elem, name, data, pvt) 

var internalkey = jquery.expando,

getbyname = typeof name === "string",

thiscache,

isnode = elem.nodetype,

// dom元素需要儲存在cache,js物件直接儲存到elem

cache = isnode ? jquery.cache : elem,

// 如果elem的jquery.expando已經有值了,就重用

id = isnode ? elem[jquery.expando] : elem[jquery.expando] && jquery.expando;

// data未定義,說明當前呼叫是查詢資料,但是物件沒有任何資料,直接返回

if((!id || (pvt && id && !cache[id][internalkey])) && getbyname && data === undefined)

if(!id) else

}// 清空原來的值

if(!cache[id]) ;

if(!isnode)

}// 用extend擴充套件cache,增加乙個屬性,用來儲存資料

if(typeof name === "object" || typeof name === "function") else

}thiscache = cahce[id];

// 避免key衝突

if(pvt) ;

}thiscache = thiscache[internalkey];

}if(data !== undefined)

return getbyname ? thiscache[jquery.camelcase(name)] : thiscache;

}removedata: function( elem, name, pvt ) else

var internalcache = cache[ id ][ internalkey ];

// 如果還有資料,就清空一次再設定,增加效能

if ( internalcache ) ;

cache[ id ][ internalkey ] = internalcache;

// 已經沒有任何資料了,就全部刪除

} else if ( isnode ) else if ( elem.removeattribute ) else

}}

jQuery 原始碼分析筆記 3

deferred機制 從1.5版本開始,jquery加入了deferred功能,讓事件處理佇列更加的完善。並用 這個機制重寫了ajax模組。雖然還沒輪到ajax,但是接下來的事件處理函式中牽扯到了 這個機制,所以提前看這段 deferred把 函式註冊到乙個佇列中,統一管理,並且可以同步或者非同步地...

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...