摘要:本文分析的版本內(nèi)部實(shí)現(xiàn)原理,版本已經(jīng)去除了大量的對(duì)于舊版本瀏覽器的兼容性的處理,但是還是有部分源碼是對(duì)不常見(jiàn)的或者老版本的瀏覽器進(jìn)行處理,在看到這部分的時(shí)候如果感興趣可以看一下,也可以直接跳過(guò),個(gè)人一直認(rèn)為學(xué)習(xí)舊版本瀏覽器的兼容是最沒(méi)有收益
本文分析的JQuery2.0.3版本內(nèi)部實(shí)現(xiàn)原理,2.0.3版本已經(jīng)去除了大量的對(duì)于舊版本瀏覽器的兼容性的處理,但是還是有部分源碼是對(duì)不常見(jiàn)的或者老版本的ie瀏覽器進(jìn)行處理,在看到這部分的時(shí)候如果感興趣可以看一下,也可以直接跳過(guò),個(gè)人一直認(rèn)為學(xué)習(xí)舊版本瀏覽器的兼容是最沒(méi)有收益的,不要在必然要被淘汰技術(shù)上浪費(fèi)太多時(shí)間
JQuery整體結(jié)構(gòu)
(function(window,undefined){ //代碼 }(window))
JQuery最外層使用的匿名函數(shù)自執(zhí)行結(jié)構(gòu),為了最大程度避免代碼污染,防止沖突
傳入?yún)?shù)window的主要目的有兩點(diǎn)
在尾端傳入的參數(shù)是實(shí)參,表明在函數(shù)執(zhí)行時(shí)第一個(gè)參數(shù)是window,這樣就避免了在內(nèi)部使用window時(shí)再次去外層查找,在js中window屬于最頂層的變量,而根據(jù)js原型鏈的查找原則,函數(shù)會(huì)優(yōu)先查找本身的變量,在查找不到的情況下逐步向上查找,所以如果在window沒(méi)有作為參數(shù)傳入到函數(shù)內(nèi)部的情況下,會(huì)從底層一直查找到最頂層,浪費(fèi)大量性能,在形參中傳入第二個(gè)參數(shù)undefined,主要是考慮到在低版本瀏覽器中undefined的值是可以改變的
//IE7 undefined=10; console.log(undefined); //10
在代碼中我們可能會(huì)需要判斷變量值===undefined的情況,為了避免我們獲取的undefined的值是被改變過(guò)的值,我們?cè)谛螀⒅袀魅胍粋€(gè)參數(shù),由于在實(shí)參中沒(méi)有傳入對(duì)應(yīng)的值,那么這個(gè)值本身就是undefined,所以我們?cè)谑褂胾ndefined時(shí)就可以直接使用該值,而不用擔(dān)心是否在操作改變過(guò)的undefined
為壓縮代碼做考慮,如果window不是參數(shù)而只是一個(gè)變量,那么window字段將無(wú)法被壓縮,但如果只是作為形參的情況下可以被壓縮為單字符,實(shí)際上我們看壓縮后的代碼。window被壓縮成了e
JQuery返回的是一個(gè)對(duì)象,JQuery采用的是面向?qū)ο蟮膶?xiě)法,在我們平常使用面向?qū)ο蟮膶?xiě)法大概如下
function A(){} A.prototype.init=function(){ } var a=new A(); a.init();
而在使用JQuery時(shí)我們不需要new $()的形式來(lái)調(diào)用是因?yàn)镴Query采用了工廠模式,使我們可以采用無(wú)"new"的形式來(lái)創(chuàng)建對(duì)象,大概寫(xiě)法如下
function JQuery(){ return new Jquery.fn.init(); }
這樣的好處在于
我們直接執(zhí)行了init的初始化方法
直接返回一個(gè)JQuery的對(duì)象,用戶不需要調(diào)用new JQuery( )后再來(lái)調(diào)用JQuery的方法
但我們會(huì)發(fā)現(xiàn)在JQuery中返回的是JQuery原型上的init方法,但是JQuery中的其他方法是寫(xiě)在JQuery的prototype上的,那么是如何在init上調(diào)用其它方法的呢,主要是通過(guò)下面代碼
//96行 JQuery.fn=JQuery.prototype={ constructor:JQuery, //... } //指定JQuery的fn就是JQuery的原型對(duì)象 //283行 JQuery.fn.init.prototype=JQuery.fn;
JQuery通過(guò)將init的原型賦值為JQuery的原型,所以通過(guò)new JQuery.fn.init()出的對(duì)象可以直接使用JQuery原型上的方法
在8826行將JQuery對(duì)象掛載到window下
window.JQuery=window.$=JQuery;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/107990.html
摘要:文章出處拜讀一個(gè)開(kāi)源框架,最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。利用下的簡(jiǎn)單工廠模式,來(lái)將所有對(duì)于同一個(gè)對(duì)象的操作指定同一個(gè)實(shí)例。所以的中提供了以上中擴(kuò)展函數(shù)。 文章出處 http://www.cnblogs.com/aaronjs/p/3278578.html 拜讀一個(gè)開(kāi)源框架,最想學(xué)到的就是設(shè)計(jì)的思想和實(shí)現(xiàn)的技巧。 廢話不多說(shuō),jquery這么多年了分析都寫(xiě)爛了,老早以前就拜讀過(guò),...
摘要:入口結(jié)構(gòu)具體代碼抽離結(jié)構(gòu)如下涉及到的知識(shí)解析函數(shù)時(shí)的規(guī)則函數(shù)定義和函數(shù)表達(dá)式閉包解析函數(shù)的規(guī)則解析器會(huì)在遇到時(shí)將其認(rèn)為是函數(shù)定義而非函數(shù)表達(dá)式函數(shù)定義和函數(shù)表達(dá)式函數(shù)定義函數(shù)表達(dá)式閉包閉包函數(shù)中的函數(shù),本質(zhì)是指作用域內(nèi)的作用域閉包舉例綜合以 1.入口結(jié)構(gòu) ( function( global, factory ) { use strict; if ( t...
摘要:通常的做法是,為它們指定回調(diào)函數(shù)。請(qǐng)求返回請(qǐng)求返回請(qǐng)求返回異步隊(duì)列解耦異步任務(wù)和回調(diào)函數(shù)為模塊隊(duì)列模塊事件提供基礎(chǔ)功能。 前言 jQuery整體框架甚是復(fù)雜,也不易讀懂,這幾日一直在研究這個(gè)笨重而強(qiáng)大的框架。jQuery的總體架構(gòu)可以分為:入口模塊、底層模塊和功能模塊。這里,我們以jquery-1.7.1為例進(jìn)行分析。 jquery的總體架構(gòu) 16 (function( window,...
摘要:譯立即執(zhí)行函數(shù)表達(dá)式處理支持瀏覽器環(huán)境微信小程序。學(xué)習(xí)整體架構(gòu),利于打造屬于自己的函數(shù)式編程類(lèi)庫(kù)。下一篇文章可能是學(xué)習(xí)的源碼整體架構(gòu)。也可以加微信,注明來(lái)源,拉您進(jìn)前端視野交流群。 前言 上一篇文章寫(xiě)了jQuery整體架構(gòu),學(xué)習(xí) jQuery 源碼整體架構(gòu),打造屬于自己的 js 類(lèi)庫(kù) 雖然看過(guò)挺多underscore.js分析類(lèi)的文章,但總感覺(jué)少點(diǎn)什么。這也許就是紙上得來(lái)終覺(jué)淺,絕知此...
摘要:匿名函數(shù)將代碼包裹在里面,防止與其他代碼沖突和污染全局環(huán)境。學(xué)習(xí)整體架構(gòu),打造屬于自己的函數(shù)式編程類(lèi)庫(kù)讀者發(fā)現(xiàn)有不妥或可改善之處,歡迎評(píng)論指出。 雖然現(xiàn)在基本不怎么使用jQuery了,但jQuery流行10多年的JS庫(kù),還是有必要學(xué)習(xí)它的源碼的。也可以學(xué)著打造屬于自己的js類(lèi)庫(kù),求職面試時(shí)可以增色不少。 本文章學(xué)習(xí)的是v3.4.1 版本。unpkg.com源碼地址:https://un...
閱讀 2749·2021-11-25 09:43
閱讀 2544·2021-09-22 15:29
閱讀 1278·2021-09-22 15:17
閱讀 3724·2021-09-03 10:36
閱讀 2295·2019-08-30 13:54
閱讀 1828·2019-08-30 11:23
閱讀 1236·2019-08-29 16:58
閱讀 1350·2019-08-29 16:14