jquery 源码分析
jquery 版本 1.12.2
浏览器: ie, 谷歌,火狐, 360
编辑器:Notepad++
载入jauery库文件的时候, 我们就得到了一个”jQuery”函数,那么这个jquery函数是怎么产生的呢?接下来我就开始一步一步解开这个答案。
请看这张图:
我稍微调整了下格式,一目了然。这个原型就是 js的匿名函数调用
(function(global, factory){
dosoming...
}(arg1, function(window, noGlobal){
dosoming...
}
));
如果不太理解的话,试着执行这两段代码体会一下:
(function(b){alert(b)}(2));
(function(b, callback){alert(b); callback()}(2, function(){ alert("function")}));
这一个结论可以得出,他在加载的时候,就自动执行了,进行初始化。
接着我们看一下,他传递的参数
1.typeof window !== “undefined” ? window : this
2.function( window, noGlobal ){ dosoming… }
第一个参数很容易解释
他判断了window对象是否存在,如果存在传递window, 否则传递this(一般浏览器的全局对象this 就是window),至于什么时候是window == ‘undefined’表示不知道…如果有牛人知道就请留言一下吧
第二个参数是一个函数,看见函数作为参数的第一反应就是这个函数作为回调函数调用。。
他接受两个参数,
第一个参数名 window 这里指的是全局对象或者是某个特定对象,比如说某个框架把jquery自己的属性
第二个参数名 noGlobal 这里指的是非全局, 参考源码“factory( global, true ) ”这个noGlobal应该是bool类型
接下来我们看一下这个函数的内部代码:
这代码其实很简单, 用三个字概括就是 “做兼容”。
一般情况下,第一个加载的js文件就是jquery, 然后浏览器又不存在model的全局对象。所以这时候调用的就是 “factory( global )”。
然后可以想象 module 是一个特殊对象,在加载jquery 之前就已经存在。。。jquery给的解释是CommonJS 和 Nodejs,有兴趣的童靴可以去了解一下。
通过上述分析,jquery真正的核心就是第二个参数 “function( window, noGlobal ){ dosoming… }” 。
接着把代码翻到最后一行。
刚才说了 在这个函数中 window 是全局对象window(目前只讨论一般情况)。说到这里大家都懂了吧?为什么jquery加载以后就就能使用
和jQuery了吗?(唠叨一句,"jQuery"或者"
”只是一个window用来创建JQuery对象的方法。)
如果还不理解的童靴可以看一下这个原型:
“(function( global, factory ) { factory(global); }(window, function(window){ var a = “我是jquery”; window.a = a; } ));”帮助理解。