[No.1] jQuery源碼解析—搭建框架(1)

在學(xué)習(xí)jQuery源碼之前姑食,

大家需要對(duì)javascript基礎(chǔ)知識(shí)掌握,

基本的使用方式應(yīng)該比較了解。

有了以上的基礎(chǔ)知識(shí)以后笋敞,

我們打開jQuery的網(wǎng)站(jquery.com)。

點(diǎn)擊這個(gè)Download我們可以獲取到最新的源碼荠瘪,

點(diǎn)進(jìn)去之后了夯巷,

我們可以看到1.1.0和2.0.3的版本。

先來說說他們有什么區(qū)別哀墓,

從2點(diǎn)幾的版本就不支持IE6,7,8了趁餐,

只支持一些高級(jí)瀏覽器,

所以這次源碼分析選擇的是2.0.3的篮绰,

為什么要選擇2.0.3呢后雷,

就是因?yàn)樗恢С諭E6,7,8的話,

這樣的話在源碼當(dāng)中會(huì)減少之前的一些兼容性寫法吠各,

對(duì)于我們了解jQuery實(shí)現(xiàn)的原理還是有幫助的臀突,

所以說選擇2.0.3的版本,讓大家來分析走孽。

下載地址:https://github.com/fewusheng/jquery惧辈,

文件我已經(jīng)下載好了,那我把他打開磕瓷。

我們從第一行開始到最后一行盒齿,一共有8830行,

這個(gè)代碼量是相當(dāng)龐大的困食,

就算我們把這些注釋去掉边翁,代碼量也是非常之多的。

如果一上來就給大家一行一行的講的話硕盹,

我相信不少同學(xué)會(huì)有點(diǎn)懵符匾,剛開始聽就暈掉了,

所以瘩例,我們可以先對(duì)這個(gè)jquery框架進(jìn)行簡(jiǎn)化處理啊胶,

把這個(gè)架子先給大家簡(jiǎn)單的搭出來甸各,

然后,我們?cè)僦饌€(gè)逐個(gè)地進(jìn)行分析焰坪。

首先趣倾,新建個(gè)js文件,

比如某饰,我這里命名的為簡(jiǎn)化JQ源碼儒恋。

然后我們打開jquery,

上來有一堆注釋是吧黔漂。

這會(huì)兒诫尽,我們先不著急,

等后續(xù)的時(shí)候我在給大家詳細(xì)的說炬守。

那我們先從第一行代碼看起:

(function( window, undefined ) {...

這里是把一個(gè)匿名函數(shù)放到一個(gè)小括號(hào)之中牧嫉,

然后到j(luò)query源碼最后的一行有一個(gè)閉合的寫法。

?... })( window );

這樣的寫法劳较,我們來看一下驹止。

打開我們創(chuàng)建的 js 文件。

首先創(chuàng)建一個(gè)函數(shù)观蜗,

把它放在一個(gè)小括號(hào)當(dāng)中,

然后后邊在加個(gè)小括號(hào)衣洁。

(?function( ){


????}) ( );

這種寫法我們把它叫做“匿名函數(shù)自執(zhí)行”

它跟普通的不加這些東西是一樣的墓捻,

里面的代碼也會(huì)執(zhí)行,

那它有什么好處呢坊夫?

那我開個(gè)頁面跟大家說一下砖第。

比如我們?cè)谶@里創(chuàng)建了一個(gè)變量a等于10,

在外邊是找不到的环凿,我們來試一下梧兼。

<script>

(?function( ){

????????var a = 10;

????} ) ( ) ;

????console.log(?a?);

</script>

打印出來的結(jié)果是:

報(bào)了一個(gè)錯(cuò),這里的a是調(diào)用不到的智听,

所以大家知道了jquery為什么把所以的代碼羽杰,

都放在這個(gè)匿名函數(shù)當(dāng)中,

其作用就是想讓這些代碼變成局部的到推,

這樣就可以防止跟其它代碼發(fā)生沖突,互相不影響考赛。

jquery光把這些內(nèi)容變成局部的,也是不夠的莉测,

它需要對(duì)外提供接口颜骤,我們才可以在外邊找到。

所以說怎樣從匿名函數(shù)對(duì)外提供接口捣卤,

做法很簡(jiǎn)單忍抽,也有很多方法八孝。

比如說有一種方法就是你要對(duì)外提供的接口,

掛在到window的下邊鸠项。

<script>

??? ?(function(){

???????? ?var a = 10;

???????? ?function $(){

????????????????console.log(a);

?????????};

????????window.$ = $;

????????})( );

????????$();

</script>

所以在這個(gè)地方再去調(diào)用的是window下的$,

也就是相當(dāng)于調(diào)用的$干跛,

我們打開網(wǎng)頁刷新一下。

打印結(jié)果是:

這時(shí)的結(jié)果就找到了锈锤,

所以說呢jquery其實(shí)它也是這樣做的驯鳖,

我們打開jquery看到里面定義了很多變量,

除了變量還有很多函數(shù)久免,所以我們來寫一下浅辙,

從21行到94行,定義了一些變量和函數(shù)阎姥。

(function(){

????????(21 , 94)

????????定義了一些變量和函數(shù)

?})( );

其中记舆,有一個(gè)函數(shù)是特別重要的,

就是下邊我們看到j(luò)Query呼巴。

把它寫在我們的js文件里泽腮。

(function(){

????????(21 , 94)

????????定義了一些變量和函數(shù)

????????jQuery = function(){}

})( );

其實(shí)這個(gè)jQuery就是我們平時(shí)用的

$()去找東西,jQuery()去找元素這個(gè)對(duì)外的接口衣赶,

這里它是一個(gè)局部的函數(shù)诊赊,我們要怎樣找到它呢?

就要向上面說過的要提供對(duì)外的接口府瞄,

所以在jQuery里面對(duì)應(yīng)的接口在8826行碧磅。

這里就是把 jQuery 函數(shù)掛在到了 window 下邊,

或者 window 下的 $ 遵馆,

所以說我們就可以通過外邊來找到 jQuery鲸郊,

或者說通過$ 找到 jQuery 這個(gè)函數(shù),

這就是對(duì)外提供的接口货邓。

接下來我們繼續(xù)網(wǎng)下看秆撮,到了96行,

這里我們看到了jQuery的prototype换况,

看到prototype我們就知道這是原型职辨,

所以說原型是面對(duì)對(duì)象的東西,

從而得知了jQuery就是基于面向?qū)ο蟮某绦?

所以說從96行開始到283行結(jié)束复隆,

這些就是給jQuery對(duì)象拨匆,添加一些方法和屬性。

接下來挽拂,

我給大家說一下為什么jQuery是基于面向?qū)ο蟮某绦颉?/span>

<script>

????????$('#div1').css();

????????$('#div1').html();

???? ? ?// 像不像我們平時(shí)使用的面向?qū)ο蟀惭每。?/span>

????????// 比如說我建一個(gè)數(shù)組對(duì)象

????????var arr = new Array();

????????// 這樣了,我就可以在這些數(shù)組中寫一些方法

????????arr.push();

????????arr.sort();

</script>

大家來看看,

之所以push和sort可以調(diào)用的話台腥,

說明前面是對(duì)象在調(diào)用這個(gè)方法宏赘。

這種寫法特別類似于我們的jQuery的寫法,

那么大家就知道了黎侈,

如果$('#div1')是個(gè)對(duì)象的話察署,

就是不是可以這樣去寫了啊。

所以說這個(gè)和面向?qū)ο笫且粯拥模?/span>

只不過$('#div1')不是一個(gè)對(duì)象峻汉,

它只是一個(gè)函數(shù)調(diào)用贴汪,

如果說它的執(zhí)行結(jié)果是對(duì)象,

是不是也可以休吠?

我們接著剛才看的那個(gè)jQuery函數(shù)扳埂,

可以發(fā)現(xiàn)函數(shù)執(zhí)行完了后,

結(jié)果 rerun 當(dāng)中就是一個(gè)new構(gòu)造函數(shù)的過程瘤礁,

所以說返回的就是一個(gè)jQ對(duì)象啊阳懂,

既然可以返回的是對(duì)象,

那么這個(gè)對(duì)象就可以調(diào)用這個(gè)方法了柜思。

我們繼續(xù)岩调,從285 - 347行,

jQuery.extend = jQuery.fn.extend = function() {

????????????????......

????};

extend是jq中繼承的一個(gè)方法赡盘,

它的作用就是希望后續(xù)添加的代碼号枕,

都可以通過extend方法,

把它掛在到j(luò)Query對(duì)象當(dāng)中陨享。

利用繼承有利于后續(xù)的擴(kuò)展堕澄,

和插件的擴(kuò)展。

接著霉咨,從349 -817行,

jQuery.extend({

????????????...

????});

這一塊就是擴(kuò)展工具的方法拍屑,

在jQuery給了我們兩種操作代碼的方式途戒,

<script>

????// 一種是

????$().css();

????$().html();

????// 還有一種是

????$.trim();

????$.proxy();

</script>

它們還是有區(qū)別的,

上面那種它是面向?qū)ο髮?shí)例的方法僵驰,

下面這里是函數(shù)下邊擴(kuò)展的方法喷斋,

這就是擴(kuò)展一些靜態(tài)的方法。

所以在jQuery當(dāng)中蒜茴,

來給面向?qū)ο髷U(kuò)展靜態(tài)屬性和靜態(tài)方法的時(shí)候星爪,

我們就把它叫做擴(kuò)展工具方法。

下邊這種方法既可以給jq用也可以給原生的js來用粉私,

而上面的方法只能給jQuery對(duì)象用顽腾。

所以說擴(kuò)展工具方法用利于

后期我們寫東西的時(shí)候用,

其實(shí)我們可以把靜態(tài)方法,

看成是在jQuery中最底層的一個(gè)東西抄肖,

而上面的是上一層或更高級(jí)的東西久信,

它們倆是這樣一種關(guān)系,

所以說很多方法都是實(shí)例方法漓摩,

里面調(diào)的都是工具方法裙士。




第一集,[No.1] jQuery源碼解析—搭建框架(1)管毙。

別走開腿椎,下集更精彩。

喜歡文章的小伙伴夭咬,

希望大家多多轉(zhuǎn)發(fā)分享啃炸,

你的分享就是我的動(dòng)力!

喜歡 分享 or
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皱埠,一起剝皮案震驚了整個(gè)濱河市肮帐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌边器,老刑警劉巖训枢,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異忘巧,居然都是意外死亡恒界,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門砚嘴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來十酣,“玉大人,你說我怎么就攤上這事际长∷什桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵工育,是天一觀的道長(zhǎng)虾宇。 經(jīng)常有香客問我,道長(zhǎng)如绸,這世上最難降的妖魔是什么嘱朽? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮怔接,結(jié)果婚禮上搪泳,老公的妹妹穿的比我還像新娘。我一直安慰自己扼脐,他們只是感情好岸军,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般凛膏。 火紅的嫁衣襯著肌膚如雪杨名。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天猖毫,我揣著相機(jī)與錄音台谍,去河邊找鬼。 笑死吁断,一個(gè)胖子當(dāng)著我的面吹牛趁蕊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仔役,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掷伙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了又兵?” 一聲冷哼從身側(cè)響起任柜,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沛厨,沒想到半個(gè)月后宙地,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逆皮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年宅粥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片电谣。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秽梅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剿牺,到底是詐尸還是另有隱情企垦,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布晒来,位于F島的核電站竹观,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏潜索。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一懂酱、第九天 我趴在偏房一處隱蔽的房頂上張望竹习。 院中可真熱鬧,春花似錦列牺、人聲如沸整陌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泌辫。三九已至随夸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震放,已是汗流浹背宾毒。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殿遂,地道東北人诈铛。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像墨礁,于是被迫代替她去往敵國(guó)和親幢竹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式恩静。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性焕毫。 1....
    LaBaby_閱讀 1,174評(píng)論 0 1
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性驶乾。 1....
    LaBaby_閱讀 1,336評(píng)論 0 2
  • 今天邑飒,更新有點(diǎn)晚, 但是干貨不怕晚轻掩, 接著昨天講得講幸乒, 把第一段講的沒講完的繼續(xù)講解诫咱。 (function(){ ...
    web_無笙閱讀 383評(píng)論 0 2
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,395評(píng)論 24 450
  • 你是否還有這樣的心情:行程中歇竟,偶然的憋見路旁的一簇花捣炬,惦念不忘愈涩?或者某天打算再去尋它霞扬? 你當(dāng)然沒有惯殊。 ...
    黃飛蝗閱讀 101評(píng)論 13 7