jQuery总体架构:
jQuery模块可以大致分为三部分:入口模块、底层支持模块、功能模块。
参考jQuery技术内幕解析
jquery源码总体架构:
(function(window,undefined){
//构造jQuery对象
var jQuery = (function(){
var jQuery = function(selector,context){
return new jQuery.fn.init(selector,context,rootjQuery);
}
return jQuery;
})();
//工具方法 Utilities
//回调函数列表 Callbacks Object
//异步队列 Deferred Object
//浏览器功能测试 Support
//数据缓存
//队列 Queue
//属性操作 Attributes
//事件系统 Events
//选择器 Sizzle
//DOM遍历操作
//样式操作
//异步请求 Ajax
//动画 Effects
//坐标、尺寸
window.jQuery = window.$ = jQuery;
}) (window);
从源码库中可以看出,源码是使用自调用匿名函数,所有的代码都被包裹在了一个立即执行的匿名函数表达式。当浏览器加载完jquery文件后,自调用匿名函数会立即开始执行,初始化jQuery的各个模块
(function(window,undefined){
var jQuery =...
//...
window.jQuery = window.$ = jQuery;
}) (window);
通过创建这样一个自调用匿名函数,创建了一个特殊的函数作用域,该作用域中的代码不会和已有的同名函数、方法和变量以及第三方库有冲突。避免了破坏和污染全局变量以至于影响到其他代码。
- 通过手动把变量jquery添加到window对象上,明确地使变量jQuery成为公开的全局变量,而其他的部分将是私有的,之所以设置参数window,可以使window对象变为局部变量,从而缩小查找作用域链,不需要回退到顶部,更快地访问window对象,另外,将window对象作为参数传入,可以在压缩代码时进行优化。
- 设置参数undefined,因为undefined是window对象的一个属性,通过把参数undefined作为局部变量使用,但是又不传入任何值,可以缩短查找undefined时的作用域链,并且可以在压缩代码时进行优化。更重要的原因是,通过这种方式可以确保参数undefined的值是undefined,因为undefined有可能会被重写为新的值
- 自调用匿名函数最后使用分号(;),通常在javascript中,如果语句分别放置在不同的行中,则分号是可选的,但是对于自调用匿名函数来说,在之前或之后省略分号都可能会引起语法错误,所以在使用自调用匿名函数时,最好不要省略自调用匿名函数之前和之后的分号