整体分析
如下,首先整个代码结构看上去就是一个闭包自执行,闭包执行的好处在于闭包拥有私有的作用域,不会污染全局作用域,最终再将jQuery作为一个命名空间导出到window下,这样代码管理起来非常方便,兼容性好。
jquery整个闭包执行,实际是执行了factory()方法,而factory()是作为参数传进去的,因此详细分析源码,就是分析作为参数传入闭包的函数。
(function( global, factory ) {
if ( typeof module === "object" && typeof module.exports === "object" ) {
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
// code
}));
闭包自执行有两种写法,以上jQuery-1.11版本,使用了写法2
// 写法1
(function(arguments) {
// code
})(arguments);
// 写法2
(function(arguments) {
// code
}(arguments));
代码分段
对jquery-1.11.1.js源码进行分段分析,可得出如下的整体架构(闭区间内数组代码具体行数)。
(function( global, factory ){
(46, 87) // 定义了一些变量以及函数jQuery = function( selector, context ) {};
(89, 172) // 定义jQuery.fn = jQuery.prototype = {}; 里面给JQ对象添加了一些方法
(174, 237) // 定义了jQuery.extend = jQuery.fn.extend = function(){}; extend是JQ对象的继承方法
(239, 584) // 调用jQuery.extend扩展了一些方法,以及定义class2type function isArraylike( obj ) {};
(585, 2730) // Sizzle
(2737, 3062) // 定义构建JQ对象的方法
(3086, 3248) // 定义jQuery.Callbacks = function( options ){};
(3251, 3391) // 定义Deferred
(3395, 3537) // ready方法
(3546, 3611 ) // support ie < 9
(3617, 3954) // 定义data() 数据缓存
(3957, 4099) // 定义queue() 队列管理
(4105, 4155) // 定义jQuery.access
(4159, 4267) // support
(4273, 5269) // 事件处理 on() off() add()
(5272, 5995) // DOM操作方法
(5998, 6889) // css操作
(6892, 6998) // jQuery.Tween
()
(7657, 8427) // val() attr() prop() addClass()
(8435, 8466) // bind()
(8477, 9994) // 提交数据和ajax() load()
(10009, 10250) // 位置和尺寸的方法
(10268, 10306) //导出jQuery命名空间
}());
对代码分段分析,整个jquery架构一目了然。