本文分析的JQuery2.0.3版本内部实现原理,2.0.3版本已经去除了大量的对于旧版本浏览器的兼容性的处理,可是仍是有部分源码是对不常见的或者老版本的ie浏览器进行处理,在看到这部分的时候若是感兴趣能够看一下,也能够直接跳过,我的一直认为学习旧版本浏览器的兼容是最没有收益的,不要在必然要被淘汰技术上浪费太多时间javascript
JQuery总体结构java
(function(window,undefined){ //代码 }(window))
JQuery最外层使用的匿名函数自执行结构,为了最大程度避免代码污染,防止冲突浏览器
传入参数window的主要目的有两点函数
在尾端传入的参数是实参,代表在函数执行时第一个参数是window,这样就避免了在内部使用window时再次去外层查找,在js中window属于最顶层的变量,而根据js原型链的查找原则,函数会优先查找自己的变量,在查找不到的状况下逐步向上查找,因此若是在window没有做为参数传入到函数内部的状况下,会从底层一直查找到最顶层,浪费大量性能,在形参中传入第二个参数undefined,主要是考虑到在低版本浏览器中undefined的值是能够改变的性能
//IE7 undefined=10; console.log(undefined); //10
在代码中咱们可能会须要判断变量值===undefined的状况,为了不咱们获取的undefined的值是被改变过的值,咱们在形参中传入一个参数,因为在实参中没有传入对应的值,那么这个值自己就是undefined,因此咱们在使用undefined时就能够直接使用该值,而不用担忧是否在操做改变过的undefined学习
JQuery返回的是一个对象,JQuery采用的是面向对象的写法,在咱们日常使用面向对象的写法大概以下prototype
function A(){} A.prototype.init=function(){ } var a=new A(); a.init();
而在使用JQuery时咱们不须要new $()的形式来调用是由于JQuery采用了工厂模式,使咱们能够采用无"new"的形式来建立对象,大概写法以下code
function JQuery(){ return new Jquery.fn.init(); }
这样的好处在于对象
但咱们会发如今JQuery中返回的是JQuery原型上的init方法,可是JQuery中的其余方法是写在JQuery的prototype上的,那么是如何在init上调用其它方法的呢,主要是经过下面代码ip
//96行 JQuery.fn=JQuery.prototype={ constructor:JQuery, //... } //指定JQuery的fn就是JQuery的原型对象 //283行 JQuery.fn.init.prototype=JQuery.fn;
JQuery经过将init的原型赋值为JQuery的原型,因此经过new JQuery.fn.init()出的对象能够直接使用JQuery原型上的方法
在8826行将JQuery对象挂载到window下
window.JQuery=window.$=JQuery;