jQuery源碼解讀-理解架構(gòu)

1哭廉、jQuery設(shè)計理念

正如jQuery的標(biāo)題:The Write Less,Do More鬓椭,無疑這就是jQuery的核心理念,這里面讓人激動的設(shè)計有簡潔的API、優(yōu)雅的鏈?zhǔn)健?qiáng)大的查詢與便捷的操作扁眯。
簡潔的API

$.on
$.css
$.ajax
….

優(yōu)雅的鏈?zhǔn)?/strong>

var  xhr = $.ajax( "./example.php" )
    .done(function() { alert("success"); })
    .fail(function() { alert("error"); })

類CSS的選擇器

$("div, span, p.myClass" )
$("div span:first-child")
...

便捷的操作

$("p").removeClass("myClass noClass").addClass("yourClass");
$("ul li:last").addClass(function(index) {
   return "item-" + index;
});
$('.container').append($('h2'));
…

2疫衩、立即調(diào)用表達(dá)式

任何庫或者框架設(shè)計的第一個需要考慮的點就是解決命名空間和全局變量污染的問題硅蹦,jQuery利用了JavaScript函數(shù)作用域的特性,采用立即執(zhí)行函數(shù)包裹了自身的方法來解決這個問題闷煤。建議在下面的閱讀前童芹,如果對立即執(zhí)行函數(shù)不是很理解的小伙伴們,先閱讀下我寫的另一篇文章:JavasSript-立即執(zhí)行函數(shù)

jQuery的立即調(diào)用函數(shù)表達(dá)式的寫法吧
one

(function(window, factory) {
    factory(window)
}(this, function() {
    return function() {
       //jQuery的調(diào)用
    }
}))

相必很多同學(xué)看到這里鲤拿,和我當(dāng)時一樣都很懵逼吧假褪,其實不用著急,對于復(fù)雜的代碼我們學(xué)會將其拆分為我們熟悉的知識結(jié)構(gòu)皆愉,然后簡化它就好了嗜价。這里我們可以開始剖解它

//相信這樣大家很容易理解,對啊就是一個簡單的匿名函數(shù)執(zhí)行函數(shù)的兩種寫法
(function() {
    /*code*/
})()
or
(function() {
    /*code*/
}())

下面我們再看一個傳參的立即執(zhí)行函數(shù)

(function(a,b) {
    /*code*/
}(c,d))

我們知道在javascript中函數(shù)作為一等公民幕庐,我們可以將一個函數(shù)作為參數(shù)傳入另一個函數(shù)中

//這里的factory是一個形參函數(shù)
(function(window, factory) {
    factory(window)
}(this, function() {    
    return function() {
       //jQuery的調(diào)用
    }
}))
//整個這樣一段就是給上面的匿名函數(shù)傳入第一個實參this久锥,第二個實參一個function,并立即執(zhí)行
(this, function() {    
    return function() {
       //jQuery的調(diào)用
    }
})

相比上面的經(jīng)過簡化分析后异剥,大家都應(yīng)該看的懂瑟由,那么想必大家肯定有一個疑問為什么要搞得怎么復(fù)雜,其實我前面已經(jīng)說過了任何庫或者框架設(shè)計的第一個需要考慮的點就是解決命名空間和全局變量污染的問題冤寿,下面我們接著看第二種簡單點的寫法

two

var factory = function(){
    return function(){
        //執(zhí)行方法
    }
}
var jQuery = factory();

其實上面的代碼效果和第一種寫法是等同的歹苦,納尼?想必寫道這里很多人會說那你前面搞的那么復(fù)雜干嘛督怜,故作高深的裝逼殴瘦,哈哈,請接著看号杠。
上面的factory函數(shù)有點變成了簡單的工廠方法模式蚪腋,需要自己調(diào)用,當(dāng)時我們需要的是一個“自執(zhí)行”的啊姨蟋,并不是另外調(diào)用的屉凯,而且上面的寫法雖然簡單,卻很容易造成全局變量的污染眼溶,這是一種魔鬼悠砚。這里順便安利一下《JavaScript語言精粹》這本書哈,這本書將告訴那些是JS中優(yōu)雅的特性和盡量避免使用的特性堂飞。

下面我們再看一下最后一種寫法吧
three

(function(window, undefined) {
    var jQuery = function() {}
    // ...
    window.jQuery = window.$ = jQuery;
})(window);

從上面的代碼可看出灌旧,自動初始化這個函數(shù)绑咱,讓其只構(gòu)建一次。詳細(xì)說一下這種寫法的優(yōu)勢:

  • window和undefined都是為了減少變量查找所經(jīng)過的scope作用域枢泰。當(dāng)window通過傳遞給閉包內(nèi)部之后羡玛,在閉包內(nèi)部使用它的時候,可以把它當(dāng)成一個局部變量宗苍,顯然比原先在window scope下查找的時候要快一些
  • undefined也是同樣的道理稼稿,其實這個undefined并不是JavaScript數(shù)據(jù)類型的undefined,而是一個普普通通的變量名讳窟。只是因為沒給它傳遞值让歼,它的值就是undefined,undefined并不是JavaScript的保留字丽啡。

可能會有疑問谋右,為什么要傳遞一個undefined啊补箍?這里我們可以這樣理解:Javascript 中的 undefined 并不是作為關(guān)鍵字改执,因此可以允許用戶對其賦值 ,簡單點就是如果函數(shù)調(diào)用不傳遞坑雅,參數(shù)默認(rèn)就是undefined

最后總結(jié)一下jQuery為什么要創(chuàng)建這樣的一個外層包裹辈挂,其原理又是如何?

  • 首先我們分析下寫法2裹粤,其實這就可以理解為一個簡單的工廠函數(shù)啊终蒂,我們可以在下面執(zhí)行n次調(diào)用。
  • 那么寫法3遥诉,首先我們這里需要區(qū)分2個概念一個是匿名函數(shù)拇泣,一個是自執(zhí)行。顧名思義矮锈,匿名函數(shù)霉翔,就是沒有函數(shù)名的函數(shù),也就是不存在外部引用了苞笨。這樣匿名函數(shù)可以有效的保證在頁面上寫入JavaScript债朵,而不會造成全局變量的污染,之后通過小括號猫缭,讓其加載的時候立即初始化葱弟,這樣就形成了一個單例模式的效果從而只會執(zhí)行一次壹店。

其實這里就是已經(jīng)再進(jìn)一步就涉及了設(shè)計模式中的工廠模式和單例模式猜丹,需要了解的可以參考下我的github:https://github.com/joinmouse/Design-Mode-

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硅卢,隨后出現(xiàn)的幾起案子射窒,更是在濱河造成了極大的恐慌藏杖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脉顿,死亡現(xiàn)場離奇詭異蝌麸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)艾疟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門来吩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蔽莱,你說我怎么就攤上這事弟疆。” “怎么了盗冷?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵怠苔,是天一觀的道長。 經(jīng)常有香客問我仪糖,道長柑司,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任锅劝,我火速辦了婚禮攒驰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘故爵。我一直安慰自己讼育,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布稠集。 她就那樣靜靜地躺著奶段,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剥纷。 梳的紋絲不亂的頭發(fā)上痹籍,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音晦鞋,去河邊找鬼蹲缠。 笑死,一個胖子當(dāng)著我的面吹牛悠垛,可吹牛的內(nèi)容都是我干的线定。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼确买,長吁一口氣:“原來是場噩夢啊……” “哼斤讥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起湾趾,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芭商,失蹤者是張志新(化名)和其女友劉穎派草,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铛楣,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡近迁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了簸州。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鉴竭。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岸浑,靈堂內(nèi)的尸體忽然破棺而出拓瞪,到底是詐尸還是另有隱情,我是刑警寧澤助琐,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布祭埂,位于F島的核電站,受9級特大地震影響兵钮,放射性物質(zhì)發(fā)生泄漏蛆橡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一掘譬、第九天 我趴在偏房一處隱蔽的房頂上張望泰演。 院中可真熱鬧,春花似錦葱轩、人聲如沸睦焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垃喊。三九已至,卻和暖如春袜炕,著一層夾襖步出監(jiān)牢的瞬間本谜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工偎窘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留乌助,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓陌知,卻偏偏與公主長得像他托,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仆葡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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

  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,388評論 24 450
  • FreeCodeCamp - Basic JavaScript 寫在前面: 我曾經(jīng)在進(jìn)谷前刷過這一套題赏参,不過當(dāng)時只...
    付林恒閱讀 16,443評論 5 28
  • @轉(zhuǎn)自GitHub 介紹js的基本數(shù)據(jù)類型。Undefined、Null登刺、Boolean、Number嗡呼、Strin...
    YT_Zou閱讀 1,158評論 0 0
  • 有過醉酒經(jīng)驗的童鞋也是生活精彩指數(shù)直線飆升呢窒悔,不過如果你不想成為事件主角的話一定要HOLD一下哦,健康最重要敌买。喜歡...
    布尼希閱讀 198評論 1 2
  • Android shell命令提升功力大法 是否還在為需要頻繁的按power鍵來復(fù)現(xiàn)一個bug而煩惱简珠?是否還在為某...
    一個OUT的人閱讀 881評論 0 1