1. 总体架构


 在工作学习之余,想学习下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中的正则表达式。