jQuery源码逐行分析学习02(第一部分:jQuery的一些变量和函数)
第一次尝试使用Office Word,方便程度大大超过网页在线编辑,不过初次使用,一些内容不甚熟悉,望各位大神见谅~
在上次的文章中,把整个jQuery的结构进行了梳理,得到了整个jQuery的简化结构,如下:
(function(){
(21 , 94) 定义了一些变量和函数 jQuery = function(){};
(96 , 283) 给JQ对象,添加一些方法和属性
(285 , 347) extend : JQ的继承方法
(349 , 817) jQuery.extend() : 扩展一些工具方法
(877 , 2856) Sizzle : 复杂选择器的实现
(2880 , 3042) Callbacks : 回调对象 : 对函数的统一管理
(3043 , 3183) Deferred : 延迟对象 : 对异步的统一管理
(3184 , 3295) support : 功能检测
(3308 , 3652) data() : 数据缓存
(3653 , 3797) queue() : 队列方法 : 执行顺序的管理
(3803 , 4299) attr() prop() val() addClass()等 : 对元素属性的操作
(4300 , 5128) on() trigger() : 事件操作的相关方法
(5140 , 6057) DOM操作 : 添加 删除 获取 包装 DOM筛选
(6058 , 6620) css() : 样式的操
(6621 , 7854) 提交的数据和ajax() : ajax() load() getJSON()
(7855 , 8584) animate() : 运动的方法
(8585 , 8792) offset() : 位置和尺寸的方法
(8804 , 8821) JQ支持模块化的模式
(8826) window.jQuery = window.$ = jQuery;
})();
这一次,我们将开始对jQuery源码进行逐行分解。
首先从一开始的注释开始
开始的注释包含了以下内容:jQuery版本,jQuery官网,sizzle官网,jQuery版权信息,软件许可以及更新时间
接下来便开始了匿名自执行函数
(function(window,undefined){})(window);
先看下传参的作用:
window参数有两个作用:第一,在代码执行过程中,一些方法、属性都是通过树形结构联结的,传入window参数就相当于给程序指明了一个查找方向,这样提高了程序查找的效率;第二,传入window参数,这样便于后期对于代码压缩,在压缩过程中,window参数会变成一个压缩程序自动生成的变量代号,这样就便于压缩了。
undefined参数有一个作用:因为在这样大体量的程序中,像undefined这样的值很容易被篡改,所以在自执行匿名函数的参数中传入undefined,防止在程序过程中被无意篡改。
接下来的注释中,有关于use strict的部分,在此做一下说明:在严格模式下,代码需要特别规范,稍有不规范就会报错,建议不要使用。举个例子:
我们正常在声明赋值变量时,以下写法是正确的:
a=10;
但是在use strict模式下就会报错,必须要是
var a=10;
又比如关于八进制数,我们一般情况下,我们可以定义八进制数:
var a=010;
但是在use strict模式下,这个八进制数是不支持的,就会报错。
接下来从(23)行开始,定义了一些变量和一些函数
rootjQuery:该变量表示jQuery的根目录,在第(866)行
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()
下面对这个结构分析一下
jQuery=function(selector,context){
return new jQuery.fn.init(selector,context,rootjQuery);
}
但在第(283)行,出现了如下代码
(283)jQuery.fn.init.prototype=jQuery.fn;
jQuery.fn的初始化方法的原型就是jQuery.fn
在普通写面向对象时
function Aaa(){}
Aaa.prototype.init=function(){};
Aaa.prototype.css=function(){};
调用的时候:
var a1=new Aaa();
a1.init();
a1.css();
我们需要手动调用初始化方法,然后再去调用其他方法;
在jQuery中,面向对象是这样的:
function jQuery(){
return new jQuery.prototype.init();
}
jQuery.prototype.init=function(){};
jQuery.prototype.css=function(){};
jQuery.prototype.init.prototype=jQuery.prototype;
调用的时候:
var a2=new jQuery();
a2.css();
就不需要再去调用初始化方法了,初始化方法在new对象的时候就已经被调用过了。
接下来定义了一些匹配正则
(67)core_pnum=...这匹配数字的正则
core_rnotwhite=...这是匹配单词
rquickExpr=...匹配防止XSS注入,防止输入框输入病毒的正则,类似<p>aaa 或者#div 这样的形式
rsingleTag=...匹配独立空标签,例如<p></p> <div></div> 这样的形式
rmsPrefix=...IE浏览器前缀
rdashAlpha=...转大小写 -l转成L这样的形式
接下来
fcamelCase=function(all,letter){
return letter.toUpperCase();
}
转驼峰命名法的回调函数
completed=function(){
document.removeEventListener('DOMContentLoaded',completed,false);
window.removeEventListener('load',completed,false);
jQuery.ready();
}
DOM加载成功之后触发的回调函数
感谢大家百忙之中来阅读我的博客~~
上一篇传送门:jQuery源码逐行分析学习01(jQuery的框架结构简化)
jQuery源码逐行分析学习02(第一部分:jQuery的一些变量和函数)的更多相关文章
- jQuery源码逐行分析学习01(jQuery的框架结构简化)
最近在学习jQuery源码,在此,特别做一个分享,把所涉及的内容都记录下来,其中有不妥之处还望大家指出,我会及时改正.望各位大神不吝赐教!同时,这也是我的第一篇前端技术博客,对博客编写还不是很熟悉,美 ...
- jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)
在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...
- jquery源码学习笔记(一)jQuery的无new构建
本人是一名.net程序员..... 你一个.net coder 看什么jQuery 源码啊? 原因吗,很简单.技多不压身吗(麻蛋,前端工作好高...羡慕). 我一直都很喜欢JavaScript,废话不 ...
- jquery 源码学习(四)构造jQuery对象-工具函数
jQuery源码分析-03构造jQuery对象-工具函数,需要的朋友可以参考下. 作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原 ...
- jQuery源码解读 - 数据缓存系统:jQuery.data
jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...
- jQuery源码学习一: 创建一个jquery实例
前言: jquery是每个前端都会的基础技能,众所周知,jquery返回的是jquery实例方法,但是我们似乎是直接使用$就可以获取到jquery的方法啦,可以在浏览器中判断一下 window.$ 和 ...
- jQuery源码分析系列
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...
- [转]jQuery源码分析系列
文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...
- 车大棒浅谈jQuery源码(二)
前言 本来只是一个自己学习jQuery笔记的简单分享,没想到获得这么多人赏识.我自己也是傻呵呵的一脸迷茫,感觉到受宠若惊. 不过还是有人向批判我的文章说,这是基本知识点,完全跟jQuery源码沾不上边 ...
随机推荐
- html button 点击链接
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- pycharm中一直跳出updating indices...indexing
直接比较明显的就是cpu直冲天际. pycharm是一款用了就不愿意换的ide,因为他的功能十分强大,同时也有着让人诟病的问题,就是他功能太全了,以至于有的功能你这辈子可能都不会去触碰,带来的直接问题 ...
- VMware workstation 虚拟机中安装乌班图及其兼容性问题
之前我在虚拟机中安装乌班图,是先安装好虚拟机,然后将预先下载好的乌班图镜像文件导入安装,这样安装起来还是有些繁琐的,中间要设置好多东西.今天领导给我拷了个虚拟机,还有乌班图的安装文件,是这样的. 对于 ...
- 【深度学习系列】CNN模型的可视化
前面几篇文章讲到了卷积神经网络CNN,但是对于它在每一层提取到的特征以及训练的过程可能还是不太明白,所以这节主要通过模型的可视化来神经网络在每一层中是如何训练的.我们知道,神经网络本身包含了一系列特征 ...
- UE4 UnLoadStreamLevel
今天测试发现一个bug记录一下,如果把某一个子关卡的加载方式设置为Always Loaded时,调用UnloadStreamLevel时不会执行Completed后面的节点,也就是一直没有完成.
- java常量池詳解
一.相关概念 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池在Clas ...
- 最近公司用到了lombok,感觉很不错的样子,所以上网搜了一些资料,总结了一下用法。
lombok作用:它提供了简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码,特别是相对于 POJO.缺点是使用lombok虽然能够省去手动创建setter和getter方法的麻烦, ...
- destoon数据库表解释说明
----------------------------- 公司认证:vcompany 实名认证:vtarde ============================================ ...
- Core Graphics 和Quartz 2D的区别
quartz是一个通用的术语,用于描述在IOS和MAC OS X中整个媒体层用到的多种技术 包括图形.动画.音频.适配. Quart 2D 是一组二位绘图和渲染API,Core Graphic会使用 ...
- Nodejs+Grunt配置SASS项目自动编译
Nodejs+Grunt配置SASS项目自动编译 早前听说Nodejs和Grunt很强大,特别是用来构建自动化的前端开发,更是强大无比.但一直碍于自己掌握的技术有限,不敢深入,也未曾深入下去.最近在开 ...