jQuery1.8.2原始碼學習入手
介紹
第一次正式寫部落格,打算通過CSDN來記錄自己的學習過程,希望自己能夠堅持下去。為什麼叫原始碼學習而不是叫原始碼解析,是因為自己還處於對原始碼一竅不通的狀態,如果有幸被大家看到我的部落格,希望大佬們指出我理解有誤的地方。如果部落格的編寫方式有問題的話,也希望大家能夠多多指導,一起學習進步。
我這裡是對jQuery的1.8.2版本進行學習,因為jq在2.0+的版本就已經放棄對ie8的支援了。之所以選擇1.8.2是想多瞭解一下jq對ie相容性的處理。推薦一個靜態資源庫(https://cdn.baomitu.com/)
正式
如何開啟對原始碼的學習
當下載完原始碼後,一臉懵逼不知道如何下手,相信很多人都是一樣懵逼。面向百度學習,大家都懂的。最後瞭解到,可以通過一個簡單的html+js斷點除錯。至於如何具體斷點除錯,大家可以去網上學習一下,本文下面會簡單地提到斷點除錯。
test.html(引入對應的js版本)如下:
<!Doctype html>
<html>
<head>
<title>study jquery code</title>
</head>
<body>
<script src="./jquery-1.8.2.js"></script>
<script>
//在控制檯列印$()
console.log($())
</script>
</body>
</html>
斷點圖片如下:
入口如下:
通過打斷點的方式找到jq的初始化入口。有沒有感到一絲絲的興奮和激動,我們已經通過簡單的幾步已經學會了如何對jQuery原始碼下手。
對入口進行分析
一、 我們先回過頭來分析程式碼的整個構建,整個程式碼被包裹在(function(window, undefined) {})(window)
中,這是一個IIFE(立即執行函式表示式),這樣做的意義如下:
a、匿名函式立即執行,防止函式內外變數名衝突,一般外掛中的原始碼對外只暴露極少數變數來提供對外掛的引用。
b、傳入window
引數,是為了方便對window
物件的引用,減少作用域查詢的時間,提高js效能。
c、undefiend
引數的作用:有些老的瀏覽器並不支援undefined
,直接使用會導致報錯,所以考慮相容性問題,需要新增改引數。
二、 開始對入口除進行分析,我們呼叫時$()
,觸發了jQuery
函式,這裡我們便需要開始發動我們的小腦筋想想這是怎麼實現的。有兩個問題:jQuery
為區域性變數,為何我們能夠訪問到?$
與jQuery
相等在何處宣告?我們通過原始碼來找到問題的答案。
答案就在9422行,內容如下:
window.jQuery = window.$ = jQuery;
//暴露jQuery介面為全域性物件
三、接著來看jQuery函式具體內容:
// Define a local copy of jQuery
jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
},
在這個函式執行完了就是一個new建構函式的過程,返回的就是一個jQuery
初始完成的物件。接著我們就可以找到jQuery.fn.init
對應的位置,開啟jQuery
學習之路啦
參考部落格:
前段百科—JS中形如(function(window, undefined) {})(window)寫法的理解
相關文章
- Vue原始碼該如何入手?Vue原始碼
- 原始碼學習原始碼
- go原始碼學習Go原始碼
- 學習HashMap原始碼HashMap原始碼
- 【原始碼學習】ThreadLocal原始碼thread
- EventBus原始碼學習原始碼
- fishhook原始碼學習Hook原始碼
- MMKV原始碼學習原始碼
- vue原始碼學習Vue原始碼
- ObjectMapper原始碼學習ObjectAPP原始碼
- express原始碼學習Express原始碼
- 原始碼閱讀:SDWebImage(一)——從使用入手原始碼Web
- 原始碼閱讀:Masonry(一)——從使用入手原始碼
- Java容器原始碼學習--ArrayList原始碼分析Java原始碼
- VeraCrypt原始碼學習-序原始碼
- 精讀《原始碼學習》原始碼
- PHP 原始碼加密學習PHP原始碼加密
- Mybatis 原始碼學習(二)MyBatis原始碼
- 學習RadonDB原始碼(二)原始碼
- 學習RadonDB原始碼(一)原始碼
- java原始碼學習-AbstractSequentialListJava原始碼
- Vue 原始碼學習(一)Vue原始碼
- Okio 框架原始碼學習框架原始碼
- java原始碼學習-SpliteratorJava原始碼
- Masonry 原始碼學習整理原始碼
- jQuery原始碼學習之$()jQuery原始碼
- vue observer 原始碼學習VueServer原始碼
- 來聊聊原始碼學習原始碼
- 原始碼學習之EllipsizingTextView原始碼TextView
- EOS原始碼學習系列原始碼
- 從Generator入手讀懂co模組原始碼原始碼
- 【菜鳥讀原始碼】halo✍原始碼學習 (一)原始碼
- 深度學習03-sklearn.LinearRegression 原始碼學習深度學習原始碼
- spring學習:spring原始碼_BeanDefinitionSpring原始碼Bean
- umi3 原始碼學習原始碼
- redis原始碼學習之slowlogRedis原始碼
- UiAutomator原始碼學習(2)-- UiAutomationBridgeUI原始碼
- UiAutomator原始碼學習(1)-- UiDeviceUI原始碼IDEdev