jQuery源碼逐行分析學習02(第一部分:jQuery的一些變數和函數)

来源:https://www.cnblogs.com/cumtchj/archive/2018/02/22/8458408.html
-Advertisement-
Play Games

第一次嘗試使用Office Word,方便程度大大超過網頁線上編輯,不過初次使用,一些內容不甚熟悉,望各位大神見諒~ 在上次的文章中,把整個jQuery的結構進行了梳理,得到了整個jQuery的簡化結構,如下: 這一次,我們將開始對jQuery源碼進行逐行分解。 首先從一開始的註釋開始 開始的註釋包 ...


第一次嘗試使用Office Word,方便程度大大超過網頁線上編輯,不過初次使用,一些內容不甚熟悉,望各位大神見諒~

在上次的文章中,把整個jQuery的結構進行了梳理,得到了整個jQuery的簡化結構,如下:

 1 (function(){
 2 (21 , 94) 定義了一些變數和函數 jQuery = function(){};
 3 (96 , 283) 給JQ對象,添加一些方法和屬性
 4 (285 , 347) extend : JQ的繼承方法
 5 (349 , 817) jQuery.extend() : 擴展一些工具方法
 6 (877 , 2856) Sizzle : 複雜選擇器的實現
 7 (2880 , 3042) Callbacks : 回調對象 : 對函數的統一管理
 8 (3043 , 3183) Deferred : 延遲對象 : 對非同步的統一管理
 9 (3184 , 3295) support : 功能檢測
10 (3308 , 3652) data() : 數據緩存
11 (3653 , 3797) queue() : 隊列方法 : 執行順序的管理
12 (3803 , 4299) attr() prop() val() addClass()等 : 對元素屬性的操作
13 (4300 , 5128) on() trigger() : 事件操作的相關方法
14 (5140 , 6057) DOM操作 : 添加 刪除 獲取 包裝 DOM篩選
15 (6058 , 6620) css() : 樣式的操
16 (6621 , 7854) 提交的數據和ajax() : ajax() load() getJSON()
17 (7855 , 8584) animate() : 運動的方法
18 (8585 , 8792) offset() : 位置和尺寸的方法
19 (8804 , 8821) JQ支持模塊化的模式
20 (8826) window.jQuery = window.$ = jQuery;
21 })();

這一次,我們將開始對jQuery源碼進行逐行分解。

首先從一開始的註釋開始

開始的註釋包含了以下內容:jQuery版本,jQuery官網,sizzle官網,jQuery版權信息,軟體許可以及更新時間

接下來便開始了匿名自執行函數

1 (function(window,undefined){})(window);

先看下傳參的作用:

    window參數有兩個作用:第一,在代碼執行過程中,一些方法、屬性都是通過樹形結構聯結的,傳入window參數就相當於給程式指明瞭一個查找方向,這樣提高了程式查找的效率;第二,傳入window參數,這樣便於後期對於代碼壓縮,在壓縮過程中,window參數會變成一個壓縮程式自動生成的變數代號,這樣就便於壓縮了。

    undefined參數有一個作用:因為在這樣大體量的程式中,像undefined這樣的值很容易被篡改,所以在自執行匿名函數的參數中傳入undefined,防止在程式過程中被無意篡改。

 

接下來的註釋中,有關於use strict的部分,在此做一下說明:在嚴格模式下,代碼需要特別規範,稍有不規範就會報錯,建議不要使用。舉個例子:

我們正常在聲明賦值變數時,以下寫法是正確的:   

1 a=10;

但是在use strict模式下就會報錯,必須要是

1 var a=10;

又比如關於八進位數,我們一般情況下,我們可以定義八進位數:     

1  var a=010;

但是在use strict模式下,這個八進位數是不支持的,就會報錯。

接下來從(23)行開始,定義了一些變數和一些函數

  rootjQuery:該變數表示jQuery的根目錄,在第(866)行

1 rootjQuery=jQuery(document);

定義該變數便於後期代碼的可維護

readyList:該變數和DOM載入有關,和ready(fn)相關的一個變數

core_strundefined=typeof undefined,字元串形式的undefined

在a==undefined和typeof a=='undefined'中,新版本瀏覽器沒有差別,但是老版本瀏覽器可能前者無法判別,所以在此處,採用這種雖然難寫一點但是保全的方式。

  location=window.location;將window下的location對象單獨定義存儲

  document=window.document;將window下的document對象單獨定義存儲

  docElem=document.documentElement;將document.element對象單獨定義存儲

接下來

  _jQuery=window.jQuery,

  _$=window.$,

這兩個變數是用於防止和其他程式產生衝突的,很多程式在對外暴露介面的時候都會選擇使用$符號,這樣就難免發生衝突,此處就是解決了這樣的衝突問題。

  class2type={}

$.type(),這是用來判斷類型的

  core_deletedIds=[]

這個變數和緩存數據有關,一般在老版本中有用

  core_version='2.0.3'

這個變數是該版本jQuery的版本號

  (52,58)core_concat=...

一些核心方法的存儲,這其中包括了concat,push,slice,indexOf,toString,hasOwn,trim方法

接下來定義了jQuery函數

  jQuery=function(){}

  $() = jQuery()

下麵對這個結構分析一下

1 jQuery=function(selector,context){
2         return new jQuery.fn.init(selector,context,rootjQuery);
3 }

但在第(283)行,出現瞭如下代碼

1 (283)jQuery.fn.init.prototype=jQuery.fn;

jQuery.fn的初始化方法的原型就是jQuery.fn

在普通寫面向對象時     

1 function Aaa(){}
2 Aaa.prototype.init=function(){};
3 Aaa.prototype.css=function(){};

調用的時候:

var a1=new Aaa();
a1.init();
a1.css();

我們需要手動調用初始化方法,然後再去調用其他方法;

在jQuery中,面向對象是這樣的:

      

1  function jQuery(){
2      return new jQuery.prototype.init();
3  }
4  jQuery.prototype.init=function(){};
5  jQuery.prototype.css=function(){};
6  jQuery.prototype.init.prototype=jQuery.prototype;

調用的時候:    

1  var a2=new jQuery();
2  a2.css();

就不需要再去調用初始化方法了,初始化方法在new對象的時候就已經被調用過了。

接下來定義了一些匹配正則

  (67)core_pnum=...這匹配數字的正則

  core_rnotwhite=...這是匹配單詞

  rquickExpr=...匹配防止XSS註入,防止輸入框輸入病毒的正則,類似<p>aaa 或者#div    這樣的形式

  rsingleTag=...匹配獨立空標簽,例如<p></p>    <div></div>    這樣的形式

  rmsPrefix=...IE瀏覽器首碼

  rdashAlpha=...轉大小寫    -l轉成L這樣的形式

接下來

1 fcamelCase=function(all,letter){
2         return letter.toUpperCase();
3 }

轉駝峰命名法的回調函數

1 completed=function(){
2         document.removeEventListener('DOMContentLoaded',completed,false);
3         window.removeEventListener('load',completed,false);
4         jQuery.ready();
5 }

DOM載入成功之後觸發的回調函數

 

感謝大家百忙之中來閱讀我的博客~~

點擊下載jQuery代碼文件

上一篇傳送門:jQuery源碼逐行分析學習01(jQuery的框架結構簡化)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本書的第4章使用第3章學到的操作DOM的方法和屬性寫了一個展示圖片的網頁,併在第5,6章對代碼進行了優化。 第一版,搭建網頁的靜態結構,包括一級標題<h1>,無序列表清單<ul>,每個列表<li>中又包括了鏈接<a>,當點擊列表文字時會顯示鏈接所指向的圖片,這屬於瀏覽器的預設行為。代碼如下: 問題: ...
  • 年前的時候進行了一家公司的電話面試兩輪,視頻面試一輪(已拿到offer),過程中遇到了一個關於http與https的問題,當時回答的並不好,今天將其進行了總結和整理,望讀者喜歡; 前言 谷歌在2018年,2月9日宣佈從今年7月起,Chrome瀏覽器將在地址欄把所有HTTP網址標示為不安全網站。 谷歌 ...
  • 通過按住滑鼠拖動的例子來演示面向對象的過程 css部分 #box1{ width: 100px; height: 100px; background: #f00; position: absolute; left: 0; top:0; } HTML部分 <div id="box1"></div> J ...
  • 新人分享些學習過程中的心得體會,有錯誤或疏漏之處還請各位不吝拍磚。 一.為什麼要面向對象? 1.在寫代碼中經常會碰到如下情況: 一個函數內的變數需要被其內嵌函數引用,若直接層層嵌套堆在一塊則不便於後期維護,這是就需要提取分離。 a.可以考慮把上一個函數的返回值作為參數傳入下一個函數。 b.更好的方法 ...
  • Paradise_追逐者的原生js總結 1.js基本數據類型 2.查找文檔中特定元素 3.定時器 4.獲取元素寬高 5.事件冒泡與事件捕獲 ...
  • 瀑布流佈局是一個之前挺火,現在也比較常見的一種佈局 這種看起來參差不齊的多欄佈局,重點在於每個元素等寬不等高,一般圖片網站應用較多 隨著頁面滾動,數據塊會在每列底部不斷載入,理論上可以無限載入,且不會頁面美觀 Pinterest、花瓣網都是比較成熟的採用瀑布流佈局的網站 效果圖: PS:這篇博客只有 ...
  • 1.BFC 定義 BFC(Block formatting context)直譯為"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block level box(塊級元素)參與, 它規定了內部的Block level Box如何佈局,並且與這個區域外部毫不相干. 通俗地來說:創建了 BFC的元素就 ...
  • 一.前言 目前的轉轉app是一個典型的hybrid app,採用的是業內主流的做法: 客戶端內有大量業務頁面使用webview內載入h5頁面承載。 其優點是顯而易見的,即:web頁面上線頻度滿足快速迭代的業務需求,不受客戶端審核和發版的時間限制,也可以將各個業務線的開發工作分攤到各個業務的fe團隊上 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...