深入解析jquery實(shí)現(xiàn)原理第一章

JQuery是一款非常優(yōu)秀的JavaScript庫(kù)歌豺,極大地提升了前端js開(kāi)發(fā)體驗(yàn),所以最近我在看jquery的源碼心包,想把自己理解的一些內(nèi)容分享給大家类咧。

首先來(lái)看一下jQuery的總體結(jié)構(gòu)代碼1-1:

(function(window,undefined){

//構(gòu)造JQuery對(duì)象

varjQuery=(function(){

varjQuery=function(selector,context){

return newjQuery.fn.int(selector,context,rootjQuery);

}

returnjQuery;

})();

//工具方法Utilities

//回調(diào)函數(shù)列表Callbacks Object

//異步隊(duì)列Deferred Object

//瀏覽器功能測(cè)試Support

//數(shù)據(jù)緩存Data

//隊(duì)列Queue

//屬性操作Attribute

//事件系統(tǒng)Events

//選擇器Sizzle

//DOM遍歷Traversing

//DOM操作Manipulation

//樣式操作CSS(計(jì)算樣式,內(nèi)聯(lián)樣式)

//異步請(qǐng)求Ajax

//動(dòng)畫Effects

//坐標(biāo)Offset蟹腾,尺寸Dimensions

window.jQuery=window.$=jQuery;

})(window);

代碼1-1

從上面的代碼中我們可以看到j(luò)query的所有代碼都是寫在了一個(gè)立即執(zhí)行的匿名函數(shù)中痕惋,這種函數(shù)叫“自調(diào)用匿名函數(shù)”。當(dāng)瀏覽器加載了jQuery的js文件后岭佳,自調(diào)用匿名函數(shù)就會(huì)立即執(zhí)行血巍,給jQuery初始化各個(gè)模塊。

首先講一下用自調(diào)用匿名函數(shù)的優(yōu)點(diǎn)珊随,創(chuàng)建自調(diào)用匿名函數(shù)就相當(dāng)于創(chuàng)建了一個(gè)特殊的函數(shù)作用域述寡,該函數(shù)中的代碼不會(huì)和已有的同名函數(shù)柿隙、方法和變量沖突。所以jQuery的代碼不會(huì)受到其他代碼的干擾鲫凶,而且也不會(huì)污染全局變量禀崖,從而影響其他代碼。自調(diào)用匿名函數(shù)還有兩種寫法螟炫,如下:

//寫法1

(function(){

//......

}());

//寫法2

!function(){

//......

}();

代碼1-2

從代碼1-1中我們可以看到在自調(diào)用匿名函數(shù)的最后將jQuery添加到了window對(duì)象上波附,從而使得變量jQuery成為公開(kāi)的全局變量,其他部分將是私有的昼钻。給自調(diào)用匿名函數(shù)設(shè)置參數(shù)window掸屡,并傳入window對(duì)象,可以將window對(duì)象變?yōu)榫植孔兞浚ò押瘮?shù)參數(shù)作為局部變量使用)然评,這樣當(dāng)在jQuery代碼塊中訪問(wèn)window對(duì)象時(shí)仅财,不需要退回頂層作用域,可以快速的訪問(wèn)window對(duì)象碗淌。

給自調(diào)用匿名函數(shù)設(shè)置undefined盏求,因?yàn)樘厥庵祏ndefined是window對(duì)象的一個(gè)屬性,例如:

alert("undefined"inwindow);//true

執(zhí)行以上代碼將會(huì)彈出true亿眠。通過(guò)這種方式可以為確保參數(shù)undefined的值是undefined碎罚,因?yàn)閡ndefined有可能會(huì)被重寫為新的值∧上瘢可以用下面的代碼來(lái)嘗試修改undefined的值:

undefined="now is's defined";

alert(undefined);

當(dāng)然荆烈,在高版本的瀏覽器中這種寫該方法已經(jīng)不支持了,比如IE9.0以上爹耗、Chrome 17.0.963.56以上和Firefox 4.0版本都是不能改變的耙考。

通常在JavaScript中,如果語(yǔ)句分別放在不同的行潭兽,則分號(hào)(;)是可選的可寫可不寫,但是對(duì)于自調(diào)用匿名函數(shù)來(lái)說(shuō)斗遏,在之前或之后省略分號(hào)都有可能會(huì)引起語(yǔ)法錯(cuò)誤山卦。如下代碼執(zhí)行就會(huì)拋出異常:

例1

varn=1

(function(){})()

//TypeError: numberis not function

在上面的代碼中,如果自調(diào)用匿名函數(shù)的前一行末尾沒(méi)有加分號(hào)诵次,則自調(diào)用匿名函數(shù)的第一對(duì)括號(hào)會(huì)被當(dāng)作是函數(shù)調(diào)用账蓉。

例2

(function(){})()

(function(){})()

//TypeError: undefined isnot function

在上面的代碼中,如果未在第一個(gè)自調(diào)用匿名函數(shù)的末尾加分號(hào)逾一,則下一行自調(diào)用匿名函數(shù)的第一對(duì)括號(hào)會(huì)被當(dāng)作是函數(shù)的調(diào)用铸本。所以,在使用自調(diào)用匿名函數(shù)時(shí)遵堵,最好不要省略自調(diào)用匿名函數(shù)的之前和之后的分號(hào)箱玷。

jQuery對(duì)象是一個(gè)類數(shù)組對(duì)象怨规,含有連續(xù)的整型屬性、length屬性和大量的JQuery方法锡足。jQuery對(duì)象由構(gòu)造函數(shù)jQuery()創(chuàng)建波丰,$()則是jQuery()的縮寫。如果調(diào)用構(gòu)造函數(shù)jQuery()時(shí)傳入的參數(shù)不同舶得,創(chuàng)建jQuery對(duì)象的邏輯也會(huì)隨之不同掰烟。構(gòu)造函數(shù)jQuery()有7種用法,如下圖:


這次主要是先將jQuery的總體結(jié)構(gòu)講一下沐批,其他的等下次分享纫骑。推薦大家看《深入解析jQuery架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理》一書,關(guān)于jquery的技術(shù)點(diǎn)講的特別細(xì)九孩。

本文原創(chuàng)首發(fā)于Cobub官網(wǎng)博客惧磺,作者:姜文杰

如有轉(zhuǎn)載請(qǐng)注明作者和出處!

推薦一款開(kāi)源私有化部署的移動(dòng)應(yīng)用數(shù)據(jù)統(tǒng)計(jì)分析系統(tǒng)Cobub Razor

項(xiàng)目地址:https://github.com/cobub/razor

官網(wǎng):www.cobub.com

開(kāi)源社區(qū)技術(shù)交流QQ群:194022996

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捻撑,一起剝皮案震驚了整個(gè)濱河市磨隘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌顾患,老刑警劉巖番捂,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異江解,居然都是意外死亡设预,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門犁河,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鳖枕,“玉大人,你說(shuō)我怎么就攤上這事桨螺”龇” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵灭翔,是天一觀的道長(zhǎng)魏烫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)肝箱,這世上最難降的妖魔是什么哄褒? 我笑而不...
    開(kāi)封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮煌张,結(jié)果婚禮上呐赡,老公的妹妹穿的比我還像新娘。我一直安慰自己骏融,他們只是感情好链嘀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布萌狂。 她就那樣靜靜地躺著,像睡著了一般管闷。 火紅的嫁衣襯著肌膚如雪粥脚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天包个,我揣著相機(jī)與錄音刷允,去河邊找鬼。 笑死碧囊,一個(gè)胖子當(dāng)著我的面吹牛树灶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糯而,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼天通,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了熄驼?” 一聲冷哼從身側(cè)響起像寒,我...
    開(kāi)封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓜贾,沒(méi)想到半個(gè)月后诺祸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祭芦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年筷笨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龟劲。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胃夏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昌跌,到底是詐尸還是另有隱情仰禀,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布避矢,位于F島的核電站悼瘾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏审胸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一卸勺、第九天 我趴在偏房一處隱蔽的房頂上張望砂沛。 院中可真熱鬧,春花似錦曙求、人聲如沸碍庵。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)静浴。三九已至堰氓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苹享,已是汗流浹背双絮。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留得问,地道東北人囤攀。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宫纬,于是被迫代替她去往敵國(guó)和親焚挠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容