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 相关文章推荐
利用discuz实现PHP大文件上传应用实例代码
Nov 14 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
PHP5 字符串处理函数大全
Mar 23 PHP
php获取当月最后一天函数分享
Feb 02 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP格式化显示时间date()函数代码
Oct 03 PHP
php多进程中的阻塞与非阻塞操作实例分析
Mar 04 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 获取全局变量的代码
2011/04/21 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
js实现左右轮播图
2020/01/09 Javascript
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
python实现多线程的两种方式
2016/05/22 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
python制作简单五子棋游戏
2019/06/18 Python
python实现低通滤波器代码
2020/02/26 Python
用python进行视频剪辑
2020/11/02 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
EJB面试题
2015/07/28 面试题
自荐信的基本格式
2014/02/22 职场文书
公司节能减排方案
2014/05/16 职场文书
酒店端午节活动方案
2014/08/26 职场文书
会计工作能力自我评价
2015/03/05 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android