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 相关文章推荐
Access数据库导入Mysql的方法之一
Oct 09 PHP
如何将数据从文本导入到mysql
Oct 09 PHP
cmd下运行php脚本
Nov 25 PHP
一步一步学习PHP(4) php 函数 补充2
Feb 15 PHP
php下使用curl模拟用户登陆的代码
Sep 10 PHP
php中mysql模块部分功能的简单封装
Sep 30 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
php array_key_exists() 与 isset() 的区别
Oct 24 PHP
PHP计算近1年的所有月份
Mar 13 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
Laravel推荐使用的十个辅助函数
May 10 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php实现的单一入口应用程序实例分析
2015/09/23 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
PHP PDOStatement::bindValue讲解
2019/01/30 PHP
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
Javascript学习笔记二 之 变量
2010/12/15 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
python实现实时监控文件的方法
2016/08/26 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python三方库之requests的快速上手
2019/03/04 Python
python代码xml转txt实例
2020/03/10 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
个人现实表现材料
2014/02/04 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
给学校的建议书
2014/03/12 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
催款函怎么写
2015/06/24 职场文书
小学体育组工作总结
2015/08/13 职场文书
一年级语文教学随笔
2015/08/14 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
python基础之文件操作
2021/10/24 Python
如何利用golang运用mysql数据库
2022/03/13 Golang