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)
// 異步隊列
// 數(shù)據(jù)緩存
// 隊列操作
// 選擇器引
// 屬性操作
// 節(jié)點遍歷
// 文檔處理
// 樣式操作
// 屬性操作
// 事件體系
// AJAX交互
// 動畫引擎
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ù)表達式的寫法有三種:
寫法1:
(function(window, factory) {
factory(window)
}(this, function() {
return function() {
//jQuery的調(diào)用
}
}))
可以看出上面的代碼中嵌套了2個函數(shù),而且把一個函數(shù)作為參數(shù)傳遞到另一個函數(shù)中并且執(zhí)行,這種方法有點復(fù)雜,我們簡化一下寫法:
寫法2:
var factory = function(){
return function(){
//執(zhí)行方法
}
}
var jQuery = factory();
上面的代碼效果和方法1是等同的振愿,但是這個factory有點變成了簡單的工廠方法模式,需要自己調(diào)用芽偏,不像是一個單例
的jQuery類揽乱,所以我們需要改成“自執(zhí)行”名眉,而不是另外調(diào)用。
寫法3:
(function(window, undefined) {
var jQuery = function() {}
// ...
window.jQuery = window.$ = jQuery;
})(window);
從上面的代碼可看出凰棉,自動初始化這個函數(shù)损拢,讓其只構(gòu)建一次。詳細說一下這種寫法的優(yōu)勢:
- window和undefined都是為了減少變量查找所經(jīng)過的scope作用域撒犀。當(dāng)window通過傳遞給閉包內(nèi)部之后福压,在閉包內(nèi)部使用它的時候,可以把它當(dāng)成一個局部變量或舞,顯然比原先在window scope下查找的時候要快一些荆姆。
- **undefined也是同樣的道理,其實這個undefined并不是JavaScript數(shù)據(jù)類型的undefined映凳,而是一個普普通通的變量名胆筒。只是因為沒給它傳遞值,它的值就是undefined诈豌,undefined并不是JavaScript的保留字仆救。
jQuery的類數(shù)組對象結(jié)構(gòu)
jQuery的入口都是統(tǒng)一的$, 通過傳遞參數(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)