小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

躺在jquery石榴裙下

 quasiceo 2012-11-22
本來(lái)準(zhǔn)備分析1.4.3,盡然有接近7000行代碼,有些吃不消,所以還是先來(lái)1.2.6的,分析完了之后再來(lái)1.4.3的

閑話不多說(shuō)了,go on!

這一節(jié)主要分析它的架構(gòu)

最外層的結(jié)構(gòu)
Java代碼  收藏代碼
  1. (function(){})()   

閉包+匿名函數(shù),好處就是獨(dú)立的作用域,加載并立即執(zhí)行內(nèi)部的代碼。

Java代碼  收藏代碼
  1. var _jQuery = window.jQuery,  
  2. _$ = window.$;   

之所以擬兩個(gè)變量$ 和 jQuery,是考慮的命名空間的問(wèn)題,比如和Prototype庫(kù)一起使用的時(shí)候,$就可能會(huì)出現(xiàn)沖突的情況,這個(gè)時(shí)候就可以使用jquery的noConflict,從而避免這種情況的發(fā)生。

Java代碼  收藏代碼
  1. var jQuery = window.jQuery = window.$ = function(selector, context) {  
  2.     return new jQuery.fn.init(selector, context);  
  3. };   

這個(gè)是jquery函數(shù)的總?cè)肟?,?dāng)我們使用$(..)返回的實(shí)際上是jQuery.fn.init實(shí)例(所以jQuery對(duì)象實(shí)際上是 jQuery.fn.init對(duì)象),并不是返回一個(gè)很純粹的jquery實(shí)例,這是為什么呢?其目的就是為了避免在生成實(shí)例的時(shí)候使用new運(yùn)算符,可 以將 $()理解為是工廠方法。

在后面的代碼會(huì)發(fā)現(xiàn)下面這一段:
Java代碼  收藏代碼
  1. jQuery.fn = jQuery.prototype (約 33行)  //1 式  
  2. jQuery.fn.init.prototype = jQuery.fn; (約 529行)  //2 式  
  3. jQuery.extend = jQuery.fn.extend = function(){..}(約 550行)  //3 式  

由1式和2式可得出:
jQuery.fn.init.prototype=jQuery.prototype,jQuery.fn.init.prototype 是$()實(shí)例的原型,jQuery.prototype是$函數(shù)的原型,兩者是有區(qū)別,簡(jiǎn)單的說(shuō)就是一個(gè)是jQuery.fn.init的原型,一個(gè) 是$的原型。

jQuery.fn = jQuery.prototype這里直接理解為jQuery.fn是$的原型

jQuery.extend給$加方法,jQuery.fn.extend是給的$.fn.init原型加方法,寫(xiě)插件的時(shí)候,這個(gè)時(shí)要區(qū)分開(kāi)的,如果是全局功能用jQuery.extend,如果是jQuery對(duì)象的功能用jQuery.fn.extend,從3式可以看出,John用這種方式,統(tǒng)一了不同接口的同一種實(shí)現(xiàn)。

Java代碼  收藏代碼
  1. var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,   
  2. isSimple = /^.[^:#\[\.]*$/,   
  3. undefined;   

先從undefined開(kāi)始講起,undefined的作用是為了加速,為什么能加速了,是因?yàn)樵瓉?lái)undefined是window上的一個(gè)屬性,這樣就會(huì)遍歷window,然后將其屬性進(jìn)行賦值,這樣就會(huì)加快后面的運(yùn)行速度

再來(lái)看quickExpr,從"|"后面的#(\w+)開(kāi)始,這個(gè)是用來(lái)判斷id的,假設(shè)用exec(我認(rèn)為最強(qiáng)大的函數(shù)),假設(shè)匹配的話那么返 回回來(lái)數(shù)組的第一個(gè)字符串就會(huì)"#idname",第二字符串就是"idname";"[^<]*(<(.|\s)+>) [^>]*"匹配諸如這樣"skdfjj<asdfw>sdjfk"的字符串,當(dāng)取數(shù)組里面下標(biāo)為1的元素,那就取到得 是"<asdfw>"

在jQuery.prototype.init函數(shù)里面就用到quickExpr

Java代碼  收藏代碼
  1. var match = quickExpr.exec(selector);   

match[1]取到得就是標(biāo)簽
match[2]標(biāo)簽名
match[3]取到的就是id

再來(lái)看isSimple英文注解上說(shuō)Is it a simple selector,/^.[^:#\[\.]*$/這個(gè)正則很簡(jiǎn)單,基本涵蓋幾種簡(jiǎn)單的選擇器,比如#id,.class,element,*,select1,select2
由此可以看出前面那一個(gè).的含義甚多,而后面的那個(gè)*號(hào)也是恰到好處,就這樣很完美的處理這幾種情況。

John說(shuō)過(guò)正則一直是人們所忽略的一塊,jquery之所以這么通用,處理問(wèn)題這么優(yōu)雅,很大程度上是因?yàn)閖s語(yǔ)法和正則的變化時(shí)無(wú)窮無(wú)盡的。

下一節(jié) 分析jquery 20-500行

分析源碼是提升水平最快的方式,并且看似好幾千行的代碼,隨著逐步分析,會(huì)理解和熟悉他的運(yùn)作方式和原理,最后真正要拿出來(lái)分析的會(huì)越來(lái)越少,以 短時(shí)間來(lái)獲取別人好幾年的技藝結(jié)晶,是相當(dāng)值的,特別是面試的時(shí)候,這些東西能讓你講出入骨三分的花樣來(lái),會(huì)讓面試官對(duì)你刮目相看。希望進(jìn)來(lái)的朋友多提提 意見(jiàn)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多