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与MySQL交互使用详解
Oct 09 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
Oct 17 PHP
查找mysql字段中固定字符串并替换的几个方法
Sep 23 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
php中AES加密解密的例子小结
Feb 18 PHP
PHP调用C#开发的dll类库方法
Jul 28 PHP
ThinkPHP添加更新标签的方法
Dec 05 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
PHP 进度条函数的简单实例
Sep 19 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 GD绘制24小时柱状图
2008/06/28 PHP
php 静态变量的初始化
2009/11/15 PHP
一步一步学习PHP(3) php 函数
2010/02/15 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
thinkPHP查询方式小结
2016/01/09 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
JS 树形递归实例代码
2010/05/18 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
vue中axios请求的封装实例代码
2019/03/23 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
Python中数字以及算数运算符的相关使用
2015/10/12 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
Python爬虫文件下载图文教程
2018/12/23 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
详解CSS3中@media的实际使用
2015/08/04 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
2014年生产管理工作总结
2014/12/23 职场文书
2015大学生求职信范文
2015/03/20 职场文书
新闻稿格式范文
2015/07/18 职场文书