結構建好了,
今天我們開始一段一段講荤堪。
(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