1. 总体架构
引自http://www.cnblogs.com/nuysoft/archive/2011/11/14/2248023.html
在工作学习之余,想学习下jquery的源码,终于要触碰这个让我又爱又怕的地方了,心里很忐忑,但是还是找到了很多的资源,学习,总结,下面是我自己的一些理解。
1.1 自调用匿名函数self-invoking anonymous function
1.在jquery源码,首先看到的是
(function( window, undefined ) {
// jquery code
})(window);
这是一个快级作用域,也叫做私有作用域,在其内的函数变量和方法,不会破坏全局的命名空间。这点非常有用也是一个JS框架必须支持的功能,
jQuery被应用在成千上万的JavaScript程序中,必须确保jQuery创建的变量不能和导入他的程序所使用的变量发生冲突。
2。匿名函数从语法上叫函数直接量,JavaScript语法需要包围匿名函数的括号,事实上自调用匿名函数有两种写法(注意标红了的右括号):
(function() {
console.info( this );
console.info( arguments );
}( window ) );
(function() {
console.info( this );
console.info( arguments );
})( window );
3.为什么传入的是window对象呢?
通过传入window变量,使得window变量从全局变量变为局部变量,挡在jquery代码块中访问window对象时,不需要将
作用域链回退到顶层作用域(我的理解是javascript程序是从前到后顺序执行的,那么在单独一个方法中访问window对象时,
它会先从最顶层的作用域向下找),这样可以更快速的访问window;这个还是关键所在,更重要的是,讲window作为参数,
可以在压缩时进行优化:
(function(a,b){})(window); // window 被优化为 a
4.为什么要在参数中增加undefined呢?
在自调用匿名函数的作用域内,确保undefined是真的未定义。因为undefined能够被重写,赋予新的值:
undefined = "now it's defined";
alert( undefined );
浏览器测试结果:
5.注意源码最后的分号
分号是可选的,但是省略分号不是一个好的编程习惯;为了更好的兼容性和健壮性,请在每行代码后加上分号,养成好习惯。
1.2 总体架构
接下来看看在自调用匿名函数中都实现了什么功能,安装代码顺序排列:
(function( window, undefined ) {
// 构造jQuery对象
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context, rootjQuery );
}
// 工具函数 Utilities
// 异步队列 Deferred
// 浏览器测试 Support
// 数据缓存 Data
// 队列 queue
// 属性操作 Attribute
// 事件处理 Event
// 选择器 Sizzle
// DOM遍历
// DOM操作
// CSS操作
// 异步请求 Ajax
// 动画 FX
// 坐标和大小
window.jQuery = window.$ = jQuery;
})(window);
从上边的注释看,jQuery的源码结构相当清晰、条理,不像代码那般晦涩和让人纠结。后边的章节基本将以这个顺序展开。
1.3 下节预告
如果你看过jQuery源码,很快就会发现这里到处充斥着正则表达式,而很多JavaScript开发人员又疏于正则基础知识,为了扫清这个障碍,下一章将先温习JavaScript正则表达式的基础知识,再详细剖析jQuery中的正则表达式。
在正式开始分析源码之前,还有没有要准备的基础知识呢?当然有。比如JavaScript API中的类和对象,如果你不熟练的话,至少手头要有一本参考手册。除了正则,其他的知识点会在分析过程中穿插讲解,不计划辟出新的章节。
另外,提供一个本文章jquery源码下载地址:http://pan.baidu.com/s/1dELufmx 密码: 1ofm