天天看點

jQuery源碼學習之總體架構

//自調用匿名函數
(function( window, undefined ) {
    // jquery code
})(window);
           

1.結構:

在第一個括号内,建立一個匿名函數;第二個括号,立即執行

2.建立自調用匿名函數的原因:

通過定義一個匿名函數,建立了一個“私有”的命名空間,該命名空間的變量和方法,不會破壞全局的命名空間。這點非常有用也是一個JS架構必須支援的功能,jQuery被應用在成千上萬的JavaScript程式中,必須確定jQuery建立的變量不能和導入他的程式所使用的變量發生沖突

匿名函數從文法上叫函數直接量,JavaScript文法需要包圍匿名函數的括号,事實上自調用匿名函數有兩種寫法(注意标紅了的右括号):

(function() {

    console.info( this );

    console.info( arguments );

}( window ) );

(function() {

    console.info( this );

    console.info( arguments );

})( window );

3.為什麼要傳入 window

通過傳入window變量,使得window由全局變量變為局部變量,當在jQuery代碼塊中通路window時,不需要将作用域鍊回退到頂層作用域,這樣可以更快的通路window;這還不是關鍵所在,更重要的是,将window作為參數傳入,可以在壓縮代碼時進行優化,看看jquery-1.6.1.min.js:

(function(a,b){})(window); // window 被優化為 a

4. 為什麼要在在參數清單中增加 undefined 呢?

在 自調用匿名函數 的作用域内,確定undefined是真的未定義。因為undefined能夠被重寫,賦予新的值

undefined = "now it's defined";
alert( undefined );
           

浏覽器測試結果:

浏覽器 測試結果 結論
ie now it's defined 可以改變
firefox undefined 不能改變
chrome now it's defined 可以改變
opera now it's defined 可以改變

繼續閱讀