jQuery 源码分析笔记


Posted in PHP onMay 25, 2011

jQuery的宗旨是Write Less, Do More。它对JavaScript的开发风格侵入性不如YUI那么强,当然也不如Dojo和YUI如此庞大。它极大的简化了JavaScript的日常开发工作,主要是DOM元素的操作(从名字Query就可以看出)。另外一个主要工作就是每个前端开发者都需要面对的浏览器兼容性。jQuery兼容所有主流浏览器的大部分版本,从万恶的IE6开始直到Firefox,Chrome等现代浏览器。除了居于核心的一小部分代码之外,剩下的jQuery都是松散的函数,扩展性很强。http://plugins.jquery.com上有成千上万的jQuery插件,你需要的功能几乎都有对应的jQuery插件,而且不止一个。
jQuery代码的头部是License声明。采用了GPLv2和MIT双协议。而在jQuery声明下是另一个项目的声明:Sizzle。这是jQuery作者另外的一个开源项目,在MIT、BSD和GPL下发布。它是一个独立的selector实现(pure-JavaScript CSS selector engine),可以独立使用。它的压缩版本只有3KB多一点,号称效率最高的选择器实现。jQuery从1.3开始使用Sizzle代替了原来的selector实现。
JS代码中有大量的()和{},这里使用的是Vim阅读,因为%命令可以快速的找到匹配的括号。
代码总体结构和变量
jQuery的代码整体上就是一个匿名函数调用:

(function (window, undefined) { 
// ... 
})(window);

这是为了避免污染全局对象,同时也可以方便的管理执行上下文。这个技巧在JS代码中经常见到,在jQuery代码中也很常见。比如,在jQuery和其他JS库同时使用时,$符号可能已经被使用了。为了仍然使用$符号:
(function ($) { 
// $("...")... 照常使用$ 
})(jQuery);

在这里传入真正的jQuery对象。
下面进入真正的实现部分,首先是$,也就是jQuery对象的声明,其中最基本的两个成员也列出来了:
var jQuery = (function() { 
var jQuery = function(selector, context) { 
// 真正的初始化函数 
return new jQuery.fn.init(selector, context, rootjQuery); 
}, 
// 一大堆变量声明 
// fn是主要的函数实现点,也是jQuery插件的起点。实际上就是JS原型 
jQuery.fn = jQuery.prototype = { 
}; 
// 一个扩展对象用的函数,可以动态地往对象上加成员。以后往jQuery里面加成员都是用extend函数完成的。 
jQuery.extend = jQuery.fn.extend = function() { 
}; 
// ... 
return jQuery; 
})();

jQuery对象是核心对象,所有$(...)得到的都是jQuery对象,除了少部分直接实现在jQuery下的Utility函数之外,大部分函数都是用extend方法加到jQuery对象里的。
PHP 相关文章推荐
PHP开发入门教程之面向对象
Dec 05 PHP
php minixml详解
Jul 19 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
PHP分多步骤填写发布信息的简单方法实例代码
Sep 23 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
Sep 30 PHP
php文件夹的创建与删除方法
Jan 24 PHP
PHP使用递归生成文章树
Apr 21 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
Mar 21 PHP
php发送http请求的常用方法分析
Nov 08 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHP rmdir()函数的用法总结
Jul 02 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
Oct 30 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
May 25 #PHP
JS 网站性能优化笔记
May 24 #PHP
PHP文件打开、关闭、写入的判断与执行代码
May 24 #PHP
php Rename 更改文件、文件夹名称
May 24 #PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 #PHP
php 定界符格式引起的错误
May 24 #PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
May 24 #PHP
You might like
php多个文件及图片上传实例详解
2014/11/10 PHP
纯php生成随机密码
2015/10/30 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
2019/05/08 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
javascript操作表格排序实例分析
2015/05/06 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
VSCode Vue开发推荐插件和VSCode快捷键(小结)
2020/08/08 Javascript
python正则表达式的使用
2017/06/12 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
Windows下python3.6.4安装教程
2018/07/31 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
Python标准库itertools的使用方法
2020/01/17 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
python实现简单井字棋游戏
2020/03/04 Python
django 模型中的计算字段实例
2020/05/19 Python
python MD5加密的示例
2020/10/19 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
学生自我鉴定范文
2013/10/04 职场文书
应届生法律顾问求职信
2013/11/19 职场文书
技术总监岗位职责
2013/12/05 职场文书
实习生岗位职责
2014/04/12 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
小学运动会加油稿
2015/07/22 职场文书
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang