jQuery整體架構(gòu)
<script type="text/javascript">
;(function(global, factory) {
factory(global);
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) {
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
jQuery.fn = jQuery.prototype = {};
// 核心方法
// 回調(diào)系統(tǒng)
// 異步隊(duì)列
// 數(shù)據(jù)緩存
// 隊(duì)列操作
// 選擇器引
// 屬性操作
// 節(jié)點(diǎn)遍歷
// 文檔處理
// 樣式操作
// 屬性操作
// 事件體系
// AJAX交互
// 動(dòng)畫(huà)引擎
return jQuery;
}));
jQuery.each( [ "get", "post" ], function( i, method ) {
jQuery[ method ] = function( url, data, callback, type ) {
// Shift arguments if data argument was omitted
if ( jQuery.isFunction( data ) ) {
type = type || callback;
callback = data;
data = undefined;
}
return jQuery.ajax({
url: url,
type: method,
dataType: type,
data: data,
success: callback
});
};
});
</script>
jQuery的立即調(diào)用函數(shù)表達(dá)式的寫(xiě)法有三種:
寫(xiě)法1:
(function(window, factory) {
factory(window)
}(this, function() {
return function() {
//jQuery的調(diào)用
}
}))
可以看出上面的代碼中嵌套了2個(gè)函數(shù),而且把一個(gè)函數(shù)作為參數(shù)傳遞到另一個(gè)函數(shù)中并且執(zhí)行,這種方法有點(diǎn)復(fù)雜,我們簡(jiǎn)化一下寫(xiě)法:
寫(xiě)法2:
var factory = function(){
return function(){
//執(zhí)行方法
}
}
var jQuery = factory();
上面的代碼效果和方法1是等同的,但是這個(gè)factory有點(diǎn)變成了簡(jiǎn)單的工廠方法模式,需要自己調(diào)用,不像是一個(gè)單例
的jQuery類,所以我們需要改成“自執(zhí)行”,而不是另外調(diào)用。
寫(xiě)法3:
(function(window, undefined) {
var jQuery = function() {}
// ...
window.jQuery = window.$ = jQuery;
})(window);
從上面的代碼可看出,自動(dòng)初始化這個(gè)函數(shù),讓其只構(gòu)建一次。詳細(xì)說(shuō)一下這種寫(xiě)法的優(yōu)勢(shì):
- window和undefined都是為了減少變量查找所經(jīng)過(guò)的scope作用域。當(dāng)window通過(guò)傳遞給閉包內(nèi)部之后,在閉包內(nèi)部使用它的時(shí)候,可以把它當(dāng)成一個(gè)局部變量,顯然比原先在window scope下查找的時(shí)候要快一些。
- **undefined也是同樣的道理,其實(shí)這個(gè)undefined并不是JavaScript數(shù)據(jù)類型的undefined,而是一個(gè)普普通通的變量名。只是因?yàn)闆](méi)給它傳遞值,它的值就是undefined,undefined并不是JavaScript的保留字。
jQuery的類數(shù)組對(duì)象結(jié)構(gòu)
jQuery的入口都是統(tǒng)一的$, 通過(guò)傳遞參數(shù)的不同,實(shí)現(xiàn)了9種方法的重載:
1. jQuery([selector,[context]])
2. jQuery(element)
3. jQuery(elementArray)
4. jQuery(object)
5. jQuery(jQuery object)
6. jQuery(html,[ownerDocument])
7. jQuery(html,[attributes])
8. jQuery()
9. jQuery(callback)