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与已存在的Java应用程序集成
Oct 09 PHP
多文件上传的例子
Oct 09 PHP
实用函数8
Nov 08 PHP
php中用数组的方法设置cookies
Apr 21 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
php禁止浏览器使用缓存页面的方法
Nov 07 PHP
php实现微信公众号无限群发
Oct 11 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
php获取当前月与上个月月初及月末时间戳的方法
Dec 05 PHP
PHP实现的简单排列组合算法应用示例
Jun 20 PHP
php实现小程序支付完整版
Oct 09 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
如何去掉文章里的 html 语法
2006/10/09 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
php工具型代码之印章抠图
2018/07/18 PHP
零基础学JavaScript最新动画教程+iso光盘下载
2008/01/22 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
JavaScript基础之this详解
2017/06/04 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
Python多进程fork()函数详解
2019/02/22 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
Python实现word2Vec model过程解析
2019/12/16 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
广州迈达威.net面试题目
2012/03/10 面试题
资产经营总监岗位职责
2013/12/04 职场文书
教师求职信范文分享
2013/12/27 职场文书
演讲比赛策划方案
2014/06/11 职场文书
安全施工责任书
2014/08/25 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
优秀志愿者感言
2015/08/01 职场文书