jQuery 源碼分析和Ready函數
這個功能在 jQuery的文檔中提到了三種等價的形式:
複製代碼 代碼如下:
// 定義在y
$(document)y(handler);
// 和上一個是同一個,不推薦
$()y(handler);
// 單獨在jQuery對象中處理
$(handler);
// 以上這個形式的定義:
if(nction(selector) {
return y(selector);
}
因此實際上都歸結與一個形式:y(fn)。定義如下:
複製代碼 代碼如下:
ready: function(fn) {
// 綁定事件到DOM上
Ready();
// 觸發回調函數
(fn);
// 返回jQuery對象
return this;
}
實際上jQuery內部並不僅僅只有一個對fn的引用。這裏用到了 Deferred功能。在75行,為jQuery對象定義了readyList成員。而在442行在bindReady函數中初始化了這個變量:
複製代碼 代碼如下:
if(readyList) {
return;
}
readyList = jQuery._Deferred();
bindReady函數除了初始化readyList之外,主要處理了瀏覽器對於綁定事件的區別。IE使用attachEvent而其他瀏覽器使用addEventHandler。這兩個步驟完成後,ready函數使用lveWith 觸發回調函數。除了這個工作外,ready還處理了holdReady。這個API 的`作用是延遲ready事件的回調,主要目的是在ready事件前做點事情。holdReady設置了一個標誌位readyWait。當這個標誌位被設置之後,ready在調用lveWith之前不停地調用setTimeout(y, 1)。即每隔固定時間就遞歸調用自己(不知道hold時間久了,js引擎會不會棧溢出),這樣最後被holdReady釋放的時候, setTimeout會沿着調用棧回來的。為了在這個棧完成之前不觸發ready回調函數。在每次調用setTimeout的時候,會遞增readyWait變量。用來指示被holdReady函數延誤了幾次調用。
###幾個基礎輔助函數
在543行開始,定義了幾個值得注意的輔助函數:parseJSON,parseXML和globalEval。parseJSON把一個字符串變成JSON對象。我們一般使用的是eval。parseJSON封裝了這個操作,但是eval被當作了最後手段。因為最新JavaScript標準中加入了JSON序列化和反序列化的API。如果瀏覽器支持這個標準,則這兩個API是在JS引擎中用Native Code實現的,效率肯定比eval高很多。目前來看,Chrome和Firefox4都支持這個API。parseJSON使用如下:
複製代碼 代碼如下:
// 原生JSON API。反序列化是JSON.stringify(object)
if( && e) {
return e(data);
}
// ... 大致地檢查一下字符串合法性
return (new Function("return " + data))();
parseXML函數也主要是標準API和IE的封裝。標準API是DOMParser對象。而IE使用的是OM的 ActiveXObject對象。定義:
複製代碼 代碼如下:
if(arser) {
tmp = new DOMParser();
xml = eFromString(data, "text/xml");
} else {
xml = new ActiveXObject("OM");
c = "false";
XML(data);
}
globalEval函數把一段腳本加載到全局context中。IE中可以使用Script。其他瀏覽器需要使用eval。因為整個jQuery代碼都是一整個匿名函數,所以當前context是jQuery。主要代碼:
複製代碼 代碼如下:
(Script || function(data) {
window["eval"](window, data); // 在window context下運行
})(data);
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想説説javascript中函數的隱含參數:argumentsarguments該對象代表正在執行的函數和調用它的函數的參數。[function.]arguments[n]參數function:選項。當前正在執行的Function對象的名字。n:選項。要傳遞給Function對象的從0開始的參數值...
-
PHP開發工程師的具體職責
PHP開發工程師的具體職責1職責:1,負責設計產品的前後台技術框架;2,承擔系統的開發工作,改進框架,基礎架構,持續優化服務;3,承擔關鍵項目的技術評審及總體設計,參與構建系統原型及關鍵技術問題的攻關活動;4,控制產品設計質量,制定產品開發規範、指導或撰寫方案、設計等文檔;5,...
-
JavaScript 函數表達式
JavaScript中創建函數主要有兩種方法:函數聲明和函數表達式。這兩種方式都有不同的適用場景。這篇筆記主要關注的是函數表達式的幾大特點以及它的使用場景,下面一一描述。主要特點可選的函數名稱函數名稱是函數聲明的必需組成部分,這個函數名稱相當於一個變量,新定...
-
學習JavaScript的7個理由
為什麼要學習JavaScript?學習JavaScript對我們的工作有什麼幫助麼?下面YJBYS小編為大家講解!需求我之所以這樣説的主要原因是,隨着JavaScript的日漸成熟,以及方案變得越來越可行,我們對JavaScript程序員的需求正在持續增長。JavaScript在需求比例上已經超過了C#,僅...