作者:yanyige | 发布时间:2017-03-06 12:33
第一章 总体架构
1.1 设计理念
Write Less, Do more。
- 兼容主流浏览器
- 具有独特的链式语法
- 具有高效灵活的CSS选择器
- 拥有便捷的插件扩展机智和丰富的插件
1.2 总体架构
jQuery模块分成三部分:入口模块、底层支持模块以及功能模块。
- 在构造函数jQuery()创建对象时传入选择器表达式就会调用Sizzle选择器。
Sizzle是一款纯JS实现的CSS选择器引擎。
- 工具模块则提供了一些编程辅助方法,用于简化jQuery对象、DOM元素、数组、对象、字符串等操作。例如: jQuery.each()、 .each()、jQuery.map()、.map()、等,其他所有模块都会用到工具模块。
- 底层支持模块,回调函数列表模块用于增强对回调函数的管理,支持添加、删除、触发、锁定、禁用回调函数等功能;异步队列模块则用于解耦异步任务和回调函数,他在回调或异步函数的基础上为回调函数增加了状态,并提供了多个回调函数列表,支持传播任意同步或者异步函数的成功或失败状态。等等。
下面看一下jQuery源码的总体架构
(function( window, undefiend ) {
//构造jQuery对象
var jQuery = (function() {
var jQuery = (function( selector, context ) {
return new jQuery.fn.init( selector, context, rootjQuery );
});
return jQuery;
})();
}(window);
那么问题来了:
为什么要创建一个自调用匿名函数? 为什么要为自调用匿名函数设置一个参数window,并且传入window对象? 为什么要为自调用匿名函数设置参数undefined?
前两个问题我知道,这里回答一下第三个问题 通过把undefined作为函数参数使用,可以缩短查找undefined时候的作用域链,并且可以在压缩代码时进行优化。优化是这样进行的:
function( a, b ) {} (window);
// 参数 window 被压缩成 a, 参数 undefined 被压缩成 b。
更重要的是,这里可以确保undefined的值是undefined,因为undefined有可能被重写为新的值。可以用下面的代码来重写undefined的值。
undefiend = 'now it's defined';
console.log(undefined);