打開jQuery源碼,首先你會看到這樣的代碼結構:jquery
(function(window,undefined){ //jquery code })(window);
這是一個自調用匿名函數。在第一個括號內,建立一個匿名函數;第二個括號內,當即執行框架
經過定義一個匿名函數,建立了一個「私有」的命名空間,該命名空間的變量和方法,不會破壞全局的命名空間。這點很是有用也是一個js框架必須支持的功能,jQuery被應用在成千上萬的JavaSctipt程序中,必須確保jQuery建立的變量不能和導入他的程序所使用的變量發生衝突函數
傳入window:由於執行js代碼是從裏到外的,經過傳入window變量,使得window由全局變量變爲局部變量,當在jQuery代碼塊中訪問window時,不須要將做用域鏈回退到頂層做用域,這樣能夠更快的訪問window;更重要的是,將window做爲參數傳入,能夠在壓縮代碼時進行優化,例如jQuery-1.6.1.min.js:
(function(a,b){})(window);//window被優化爲a
優化
(1)Javascript 中的 undefined 並非做爲關鍵字,所以能夠容許用戶對其賦值,例如IE8:code
var undefined = 'change' ;(function(window) { alert(undefined);//IE8 'change' })(window)(2)行參undefined是局部的,因此就算在外部定義了undefined,裏面的undefine依然不受影響。這樣子最大程度防止外界的變量定義對內部形成影響ip