[No.4] jQuery源碼解析—逐段解析(4)

結構建好了,

今天我們開始一段一段講荤堪。

(function(){

? ? ? ? (21 , 94) 定義了一些變量和函數(shù) jQuery = function(){};

? ? ? ? (96 , 283) 給JQ對象深夯,添加一些方法和屬性

? ? ? ? (285 , 347) extend : JQ的繼承方法

? ? ? ? (349 , 817) jQuery.extend() : 擴展一些工具方法

????????(877 , 2856) ?Sizzle : 復雜選擇器的實現(xiàn)

? ? ? ? (2880 , 3042) Callbacks : 回調對象 : 對函數(shù)的統(tǒng)一管理

? ? ? ? (3043 , 3183) Deferred : 延遲對象 : 對異步的統(tǒng)一管理

? ? ? ? (3184 , 3295) support : 功能檢測

? ? ? ? (3308 , 3652) data() : 數(shù)據(jù)緩存

? ? ? ? (3653 , 3797) queue() : 隊列方法 : 執(zhí)行順序的管理

? ? ? ? (3803 , 4299) attr() prop() val() addClass() : 對元素屬性的操作

? ? ? ? (4300 , 5128) on() trigger() : 事件操作的相關方法

? ? ? ? (5140 , 6057) DOM操作 : 添加 刪除 獲取 包裝 DOM篩選

? ? ? ? (6058 , 6620) css() : 樣式的操作

? ? ? ? (6621 , 7854) 提交的數(shù)據(jù)和ajax() : ajax() load() getJSON()

? ? ? ? (7855 , 8584) animate() : 運動的方法

? ? ? ??(8585 , 8792) offset() : 位置和尺寸的方法

? ? ? ??(8804 , 8821) JQ支持模塊化的模式

? ? ? ? (8826) ?window.jQuery = window.$ = jQuery;

? ? })();

第一段辈双,21到94行挽绩,

它們定義了一些函數(shù)伞广,

還有剛開始的匿名函數(shù)自執(zhí)行汁果,

打開jQuery源碼涡拘,

/*!

* jQuery JavaScript Library v2.0.3

* http://jquery.com/

*

* Includes Sizzle.js

* http://sizzlejs.com/

*

* Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors

* Released under the MIT license

* http://jquery.org/license

*

* Date: 2013-07-03T13:30Z

*/

上來是一些注釋,

我簡單地給大家說一說据德,

第一行:咱們使用的是jQuery2.0.3的版本鳄乏,

第二行是它的官方網站,

那下邊是Sizzle.js的官方網站棘利,

前面我們說過Sizzle在jQuery中橱野,

是一個復雜選擇器的實現(xiàn),

那它也是一個獨立的善玫,

所以也可以直接來用這個庫水援,

在下邊是它的版權,從05-13年茅郎,

歸于jQuery基金會所有蜗元,

還有一些贊助過jQuery的人,

它也符合MIT系冗,也有軟件許可證奕扣,

說白了jQuery就是一個免費合法的一個軟件,

最后是它最近更新的一個時間毕谴。

接著我們來看到成畦,

在jQuery中距芬,這個注釋非常多,

在這些注釋當中循帐,

我們經常會看到如(#13335)框仔,

#號后面跟一串數(shù)字,

這是什么意思拄养?

意思就是可以通過它离斩,

找到更詳細的說明,????

我們打開https://bugs.jquery.com瘪匿,

然后跛梗,把這個索引放到輸入框內,

進行搜索棋弥,

然后我們就可以看到跟這一塊有關核偿,

更加具體的說明,

下邊還有很多人留言和討論顽染,

都可以查看得到漾岳。

再下來我們看到一行,

在之前跟大家講過粉寞,

這個匿名函數(shù)自執(zhí)行尼荆,

(function( window, undefined ) {

它的一個作用是里面的代碼都是局部的,

然后呢唧垦,跟外邊的代碼不沖突捅儒,

就是這樣一個作用,

那我們老看一下振亮,

它為什么要把window當參數(shù)巧还,

傳到這個閉包當中,

<script>

????????// 在jQuery中一上來就是一個匿名函數(shù)自執(zhí)行

????????(function(window){

????????// 先傳了一個window ? ?

????????// })(window);

????????// 如果不傳這個window

????????// 我們直接在這個里面使用window其實也是可以的

????????window

????????// 那它為什么還要去傳呢双炕?

????????// 有兩點

????????// 第一點:window是我們js的最頂端,它的查找速度比較慢

????????// 根據(jù)這個作用域面的原理狞悲,變量是找離它最近定義那個變量開始查找

????????// 如果找不到的話,它才會一層一層往外找

????????// 所以說在你傳參之后妇斤,它找是里面的這個window摇锋,不會去找外邊的window ?

????????// 它的查找速度更快

????????// })()

????????// 第二點:這個window傳過來之后,對于壓縮版本就很有用的

????????// 如果是不傳window它是壓縮不了的站超,

????????})(window)

</script>

然后我們打開這個壓縮版本荸恕,

可以看到,傳過來的就不是window了死相,

而是e了融求,是吧!

所以下邊用到e的都是window,

對于算撮,壓縮來說的特方便的生宛,

這就是它為什么要傳window县昂,

對于查找和壓縮都有好處。

其實在下邊很多變量都是跟這個有關的陷舅,

咱們到時候讀到的時候倒彰,再給大家去講。


接著莱睁,看這個undefined待讳,它也是傳過來的,

它沒有被壓縮仰剿,為什么要傳它呢创淡?

首先,我們來了解一下這個undefined屬性南吮,

它既不是保留字琳彩,也不是關鍵字,

這個undefined在外邊是可以被修改的部凑,

// 比如我定義了一個undefined等于十

var undefined = 10;

// 然后我打印一下

console.log(undefined);

在IE10下汁针,它是undefined,

在IE8下是10砚尽,

所以說在jQuery當中,

為了防止在外對這個undefined進行修改辉词,

所以它進行了一個傳參的形式必孤,

如果里面使用undefined,

肯定是找這個傳入的參數(shù)瑞躺,

而不會找外面的敷搪,對吧,

這樣就能防止被修改幢哨,

所以赡勘,需要傳入一個undefined。


接下來捞镰,我們看下面這一塊闸与,

// Can't do this because several apps including ASP.NET trace

// the stack via arguments.caller.callee and Firefox dies if

// you try to trace through "use strict" call chains. (#13335)

// Support: Firefox 18+

//"use strict";

這一塊寫了很多的注釋,

看到這句話是什么意思呢岸售?

//"use strict";

意思是說只要寫了它践樱,

js是在一個嚴格的模式下,

然后我們來看一下究竟是什么意思凸丸,

假如在我們的文件中寫了個它拷邢,

說明這里的js在一個嚴格的模式下,

在嚴格的模式下就是要讓我們寫代碼要規(guī)范屎慢,

如果出現(xiàn)不規(guī)范的代碼瞭稼,這個程序就會報錯忽洛,

"use strict";

a = 10;

比如我們平時寫個a,如果不加var的話环肘,

平時也是可以的欲虚,就相當于一個全局的,

但是這里添加了嚴格模式廷臼,就會報錯苍在。

如果把這句話注釋起來,

a等于10就完全可以荠商。

除了有這種問題以外呢寂恬,

在嚴格模式下有問題的特別多,

再給大家舉個例子吧莱没。

var a = 010;

比如說我們這里寫的是一個八進制的數(shù)字初肉,

在非嚴格模式下是不會報錯的,

但是在嚴格模式下饰躲,就會報錯牙咏,

?它是不允許寫這種八進制的形式的內容,

所以這個在嚴格模式下嘹裂,條條框框比較多妄壶,

這樣有利于我們的寫法。

但是在jQuery中并不推薦我們去使用它寄狼,

首先丁寄,它的兼容性有些問題,

還有就像它寫的不支持.net火狐的老版本泊愧,

經常會出現(xiàn)假死的狀態(tài)伊磺,或者.net這個跟蹤有問題,

所以說他建議我們不要去使用删咱,除非你對它很了解屑埋。

比如火狐18+就不出現(xiàn)火狐假死的狀態(tài)了。

這個痰滋,我們平時寫代碼的時候沒有必要去寫嚴格模式摘能,

寫代碼的時候自己多注意一下代碼規(guī)范就好了。


接下來敲街,我們看到?rootjQuery?這個變量徊哑,

這個變量的作用就是jQuery的一個跟目錄,

在866行聪富,有這么一句話莺丑,

rootjQuery = jQuery(document);

這個變量就是jQuery選擇到的document元素,

那它為什么要賦給這個變量?

也是有兩點考慮吧梢莽,在我看來萧豆,

首先第一個,就像剛才說的昏名,

你去整體的賦值的話涮雷,

這個變量在壓縮版本的時候,

它就可以變成一個字符轻局,

如果說在下面的代碼用jQuery(document)洪鸭,

它就沒有辦法進行壓縮,是吧仑扑!

不能變成一個字符览爵。

第二個就是我們比如說去開發(fā)的時候,

// 比如說

a = a + 10 ;

如果這樣去寫的話镇饮,

我們根本就不知道蜓竹,

這個10代表的是什么意思,

對于代碼可維護性储藐,不是那么方便俱济。

如果說把這個10賦值給一個變量。

var iSpeed = 10;

a = a + iSpeed ;

這時候大家就知道了钙勃,

原來這個10蛛碌,表示的是速度,

所以說定義一個變量辖源,

對于后面的維護左医,

有著很大的幫助。


下面這個變量是和DOM加載有關的同木,

????// The deferred used on DOM ready

????readyList,

所以,等到我們講到DOM加載的時候跛十,

再來說一下彤路,它是干什么用的,

這個DOM加載在我們的這擴展工具和Sizzle之間的一塊芥映,

到時候講到這兒的時候再來給大家詳細的來說洲尊。


????// Support: IE9

????// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`

????core_strundefined = typeof undefined,

下邊這一段,先看這句typeof?undefined,

它得到的是字符串的undefined奈偏,

所以說這個變量存的就是一個字符串形式的undefined,

那它為什么會這么做坞嘀?

上邊也給了解釋,我們先不看這個解釋惊来,

先來看看用typeof去判斷還是直接用undefined有什么不同丽涩,

// 比如看window下的a是否存在

window.a == undefined;

// 或者用typeof

typeof window.a?== 'undefined';

其實這兩種寫法都可以判斷window下的這個屬性是否存在,

但是非常少的情況下,光用上面的那種判斷是不行的矢渊,

什么情況下不能呢继准?

就是上班注釋上面寫的,這個支持IE9矮男,

其實呢移必,在IE老版本當中包括IE6,7,8都會有這個問題,

只不過毡鉴,這個2.0的版本不考慮IE6,7,8崔泵,

在老版本的瀏覽器下假如我們去判斷的是xmlnode的方法或屬性,

這個時候光用上面的那種形式去判斷猪瞬,它可能判斷不出來憎瘸,

判斷的證據(jù)不充分,所以要做到所有兼容需要用第二種方法撑螺,

它是全部兼容的含思,這種出現(xiàn)問題的情況非常少,

在這個xml的情況下才會有問題甘晤,本來我們用xml的時候又不多含潘,

所以說這是小眾情況下有這樣一個bug。

像這個問題我們也可以用bugs去搜索线婚,

雖然沒有索引號遏弱,但是依然能夠搜索,

可以看到一些它的詳細的描述塞弊。

OK,咱們這節(jié)暫時講到這里漱逸!



回看上一集:

原文中此處為鏈接,暫不支持采集


別走開游沿,下集更精彩饰抒。

喜歡文章的小伙伴,

希望大家多多轉發(fā)分享诀黍,

你的分享就是我的動力袋坑!

喜歡 分享 or
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市眯勾,隨后出現(xiàn)的幾起案子枣宫,更是在濱河造成了極大的恐慌,老刑警劉巖吃环,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件也颤,死亡現(xiàn)場離奇詭異,居然都是意外死亡郁轻,警方通過查閱死者的電腦和手機翅娶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人故觅,你說我怎么就攤上這事厂庇。” “怎么了输吏?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵权旷,是天一觀的道長。 經常有香客問我贯溅,道長拄氯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任它浅,我火速辦了婚禮译柏,結果婚禮上,老公的妹妹穿的比我還像新娘姐霍。我一直安慰自己鄙麦,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布镊折。 她就那樣靜靜地躺著胯府,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恨胚。 梳的紋絲不亂的頭發(fā)上骂因,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音赃泡,去河邊找鬼寒波。 笑死,一個胖子當著我的面吹牛升熊,可吹牛的內容都是我干的俄烁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼级野,長吁一口氣:“原來是場噩夢啊……” “哼页屠!你這毒婦竟也來了?” 一聲冷哼從身側響起勺阐,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矛双,沒想到半個月后渊抽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡议忽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年懒闷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡愤估,死狀恐怖帮辟,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情玩焰,我是刑警寧澤由驹,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站昔园,受9級特大地震影響蔓榄,放射性物質發(fā)生泄漏。R本人自食惡果不足惜默刚,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧薪介,春花似錦退敦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秃流,卻和暖如春赂蕴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舶胀。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工概说, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嚣伐。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓糖赔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轩端。 傳聞我的和親對象是個殘疾皇子放典,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容