(function( window, undefined ) {
// jquery code
})(window);
|
1.這是一個自調用匿名函數。什么東東呢?在第一個括號內,創建一個匿名函數;第二個括號,立即執行
2.為什么要創建這樣一個“自調用匿名函數”呢?
通過定義一個匿名函數,創建了一個“私有”的命名空間,該命名空間的變量和方法,不會破壞全局的命名空間。這點非常有用也是一個JS框架必須支持的功能,jQuery被應用在成千上萬的JavaScript程序中,必須確保jQuery創建的變量不能和導入他的程序所使用的變量發生沖突。
3.匿名函數從語法上叫函數直接量,JavaScript語法需要包圍匿名函數的括號,事實上自調用匿名函數有兩種寫法(注意標紅了的右括號):
(function() {
console.info( this );
console.info( arguments );
}( window )
);
(function() {
console.info( this );
console.info( arguments );
}
)( window );
4.為什么要傳入window呢?
通過傳入window變量,使得window由全局變量變為局部變量,當在jQuery代碼塊中訪問window時,不需要將作用域鏈回退到頂層作用域,這樣可以更快的訪問window;這還不是關鍵所在,更重要的是,將window作為參數傳入,可以在壓縮代碼時進行優化,看看jquery-1.6.1.min.js:
(function(a,b){})(window); // window 被優化為 a
|
5.為什么要在在參數列表中增加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 | 可以改變 |
6. 注意到源碼最后的分號了嗎?
分號是可選的,但省略分號并不是一個好的編程習慣;為了更好的兼容性和健壯性,請在每行代碼后加上分號并養成習慣。