1. 總體架構(gòu)1.1 自調(diào)用匿名函數(shù) self-invoking anonymous function打開jQuery源碼,首先你會看到這樣的代碼結(jié)構(gòu):
1. 這是一個自調(diào)用匿名函數(shù)。什么東東呢?在第一個括號內(nèi),創(chuàng)建一個匿名函數(shù);第二個括號,立即執(zhí)行 2. 為什么要創(chuàng)建這樣一個“自調(diào)用匿名函數(shù)”呢? 通過定義一個匿名函數(shù),創(chuàng)建了一個“私有”的命名空間,該命名空間的變量和方法,不會破壞全局的命名空間。這點非常有用也是一個JS框架必須支持的功能,jQuery被應(yīng)用在成千上萬的JavaScript程序中,必須確保jQuery創(chuàng)建的變量不能和導(dǎo)入他的程序所使用的變量發(fā)生沖突。 3. 匿名函數(shù)從語法上叫函數(shù)直接量,JavaScript語法需要包圍匿名函數(shù)的括號,事實上自調(diào)用匿名函數(shù)有兩種寫法(注意標(biāo)紅了的右括號):
4. 為什么要傳入window呢? 通過傳入window變量,使得window由全局變量變?yōu)榫植孔兞?,?dāng)在jQuery代碼塊中訪問window時,不需要將作用域鏈回退到頂層作用域,這樣可以更快的訪問window;這還不是關(guān)鍵所在,更重要的是,將window作為參數(shù)傳入,可以在壓縮代碼時進(jìn)行優(yōu)化,看看jquery-1.6.1.min.js:
5. 為什么要在在參數(shù)列表中增加undefined呢? 在 自調(diào)用匿名函數(shù) 的作用域內(nèi),確保undefined是真的未定義。因為undefined能夠被重寫,賦予新的值。
瀏覽器測試結(jié)果:
6. 注意到源碼最后的分號了嗎? 分號是可選的,但省略分號并不是一個好的編程習(xí)慣;為了更好的兼容性和健壯性,請在每行代碼后加上分號并養(yǎng)成習(xí)慣。 1.2 總體架構(gòu)接下來看看在 自調(diào)用匿名函數(shù) 中都實現(xiàn)了什么功能,按照代碼順序排列:
從上邊的注釋看,jQuery的源碼結(jié)構(gòu)相當(dāng)清晰、條理,不像代碼那般晦澀和讓人糾結(jié)。 后邊的章節(jié)基本將以這個順序展開。 |
|