jquery的2 0 3版本原始碼系列 1 總體結構

2022-04-08 16:41:44 字數 2904 閱讀 4661

為什麼選擇2.x版本,而不是1.x版本,因為2.x不相容ie6/7/8,所以少了相容**,讓我們更專注於jquery原理的**。

一共有8830行。

首先,匿名函式的作用是,把函式內部的變數和函式變成"區域性變數"和"區域性函式"的,那麼就不會與外部的變數和函式發生衝突了。

(function())();

alert(a);報錯,"uncaught referenceerror: a is not defined"。

(function()

})();

$();//console報錯,"uncaught referenceerror: $ is not defined"

第二,如何對外部提供介面,讓外部可以呼叫jquery()函式。方式是把$函式掛載到window物件上。

(function()

window.$=$;

})();

$();//那麼現在就可以在匿名函式外部呼叫$(),也就是jquery()函式。

第三,window引數。為什麼要傳這個引數呢?

不傳,匿名函式可以取到window物件嗎?答案是可以的。

傳window引數的好處是:

(1)查詢速度快:window是作用域鏈的最頂端,那麼傳了之後就不用在匿名函式呼叫window時往外一層層的找了。

(2)壓縮的好處:壓縮時,window變成字母,能更好的優化。下圖是2.0.3壓縮版本。

第四,undefined引數。

undefined既不是保留字,也不是關鍵字,它是window的乙個屬性。它在某些瀏覽器中,可以被修改,能夠被賦值。

var undefined=10;

alert(undefined);

瀏覽器ie10的顯示效果

瀏覽器ie7的顯示效果

21行-94行,定義了一些變數和函式,jquery=function(){}。

96行-283行,給jquery物件,新增一些方法和屬性(jquery是基於物件導向的程式)

從下面的寫法可以看出,arr是物件,那麼呼叫方法就直接使用點語法,它和jquery的方法呼叫十分相似。

285行-347行,extend是jq的繼承方法。繼承有利於**的獨立性和擴充套件。

349行-817行,jquery.extend():擴充套件了一些工具方法。

jquery提供了2種操作**的方式,一種是例項方法,它給jq物件使用,另一種是靜態方法($是乙個函式,那麼是擴充套件工具方法),既可以給jq物件使用,也可以給原生的js使用。

靜態方法更加底層一些。

877行-2856行,sizzle是複雜選擇器的實現。sizzle。

2880行-3042行,callbacks是**物件。它是函式的統一管理。

首先引入jquery庫,然後參照如下**。**通過**函式cb對函式進行觸發fire,刪除remove。

function fn1()

function fn2()

var cb=$.callbacks();

cb.add(fn1);

cb.add(fn2);

cb.fire();

cb.remove(fn2);

cb.fire();

3043行-3183行,deferred延遲物件,它是對非同步的統一管理。

第一種**看起來是十分奇怪的,明明彈出字串2是寫在後面,可是事實上是先執行,然後再彈出2。否則就要把alert出2巢狀進定時器裡邊兒。

settimeout(function(),1000);

alert(2);

第二種是延遲物件的寫法,寫起來是同步,但執行的時候是非同步。

var dfd=$.deferred();//定義延遲物件。

settimeout(function(),3000);

dfd.done(function())

3184行-3295行,support:功能檢測。對瀏覽器發展非常有用的。checkon老版本的瀏覽器預設空字串,新版本的瀏覽器是on,那麼以此來區分新舊瀏覽器。

3308行-3652行,data():資料快取。比如獲取、刪除、設定資料。data並非掛載到元素身上,而是通過一系列的操作。否則,如果掛載到元素上,又操作了物件,那麼會發生記憶體洩漏。

3653行-3797行,queue()佇列管理。

3803行-4299行,attr()、prop()、val()、addclass()等,對元素屬性的操作。

4300行-5128行,on()、trigger(),事件操作的相關方法。

5140行-6057行,dom操作:新增、刪除、獲取、包裝、innerhtml、dom篩選。

6058行-6620行,css():樣式的操作。

6621行-7854行,資料和ajax():比如跨域、load()、getjson等。

7855行-8584行,animate():運動的方法,show()、hide()。

8585行-8792行,offset():位置與尺寸的方法。

8804行-8821行,jq支援模組化的模式,比如commonjs、cmd規範。

8826行,window.jquery=window.$=jquery;對外提供介面。

mysql安裝(5 7版本原始碼安裝)

環境是ubuntu16.04 嘗試安裝最新的mysql5.7.21版本,發現以前安裝指令碼執行後會報錯缺少boost 1 59 0 5.7版本依賴於boost 1 59 0,嘗試用1.63.0版本替換失敗 mariadb 10.2.13卻完美相容mysql以前的安裝語句 第一步執行 sudo apt...

KCP C 版本 原始碼解析

kcp send 對使用者的資料根據mss值進行分片,然後將分片後的資料放入snd queue。kcp flush,每次被呼叫的時候遍歷出隊snd queue 條件為snd nxt snd una cwnd 對每個seg的sn與una編號,cmd ikcp cmd push,進行初始化後,放入snd...

《k8s 1 13版本原始碼分析》 原始碼除錯

寫在前面 本文已過時,請移步 daniel hu s blog 本節內容並不是在準備好k8s環境後就寫的,大家也不需要在開始看原始碼前研究怎麼除錯 今天之前我已經發了 排程器優選過程 也就是差不多準備好k8s環境後乙個月了。所以大家也可以先跳過本節,先開始看後面的原始碼分析,靈活把握開始除錯原始碼的...