(function(global, factory) {
//commonjs處理
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = global.document ?
factory(global, true) :
function(w) {
if (!w.document) {
throw new Error("jQuery requires a window with a document");
}
return factory(w);
};
} else {
factory(global);
}
}(typeof window !== undefined ? window : this, function(window, noGlobal) {
//當程序運行在 Node.Js 環(huán)境下钥组,比如服務器環(huán)境下,這時候不是直接運行在瀏覽器環(huán)境下妄帘,也就不能直接獲取 window 對象了名斟,所以,這里檢查了一下枣察,當前是否有 window 對象争占,沒有的化,就將 this 傳進來序目。
//noGlobal是否掛在全局變量上臂痕。為true時沒有掛在某個全局變量上。undefined時掛在全局變量上猿涨。
var jQuery = function(selector, context) {
return new jQuery.fn.init(selector, context);
};
jQuery.fn = jQuery.prototype = {};
// 核心方法
// 回調(diào)系統(tǒng)
// 異步隊列
// 數(shù)據(jù)緩存
// 隊列操作
// 選擇器引
// 屬性操作
// 節(jié)點遍歷
// 文檔處理
// 樣式操作
// 屬性操作
// 事件體系
// AJAX交互
// 動畫引擎
if (typeof define === "function" && define.amd) {
define("jquery", [], function() {
return jQuery;
});
}
if (typeof noGlobal === strundefined) {
window.jQuery = window.$ = jQuery;
}
return jQuery;
}))
從上面的代碼可看出握童,自動初始化這個函數(shù),讓其只構建一次叛赚。詳細說一下這種寫法的優(yōu)勢:
- window和undefined都是為了減少變量查找所經(jīng)過的scope作用域舆瘪。當window通過傳遞給閉包內(nèi)部之后,在閉包內(nèi)部使用它的時候红伦,可以把它當成一個局部變量英古,顯然比原先在window scope下查找的時候要快一些。
- undefined也是同樣的道理昙读,其實這個undefined并不是JavaScript數(shù)據(jù)類型的undefined召调,而是一個普普通通的變量名。只是因為沒給它傳遞值,它的值就是undefined唠叛,undefined并不是JavaScript的保留字只嚣。