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 相关文章推荐
Content-type 的说明
Oct 09 PHP
基于文本的留言簿
Oct 09 PHP
php GD绘制24小时柱状图
Jun 28 PHP
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
php 多线程上下文中安全写文件实现代码
Dec 28 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 PHP
PHP实现事件机制实例分析
Jun 26 PHP
php生成txt文件实例代码介绍
Apr 28 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
Oct 17 PHP
浅谈php处理后端&接口访问超时的解决方法
Oct 29 PHP
php mysql操作mysql_connect连接数据库实例详解
Dec 26 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 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定时自动生成静态HTML的实现代码
2010/06/20 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
Python Tkinter简单布局实例教程
2014/09/03 Python
利用Python演示数型数据结构的教程
2015/04/03 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
Python对列表的操作知识点详解
2019/08/20 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
文员个人的求职信范文
2013/09/26 职场文书
核心价值观演讲稿
2014/05/13 职场文书
环保倡议书300字
2014/05/15 职场文书
简单的辞职信模板
2015/05/12 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
python中的被动信息搜集
2021/04/29 Python