jquery源码解读 ,摘自jQuery源码分析系列图书

1。总体架构

1.1自调用匿名函数

//自调用匿名函数

(function(window,undefined){

  //jquery code

})(window);

1.这是一个自调用匿名函数。第一个括号内创建一个匿名函数,第二个括号,立即执行

2。为什么要创建这样一个“自调用匿名函数”呢???

通过定义一个匿名函数,创建一个“私有”的命名空间,该命名空间的变量和方法,不会破坏全局的命名空间。这点非常有用也是js框架必须支持的功能,jQuery应用,必须要确保jQuery创建的变量不能和导入他的程序所使用的变量冲突

3.匿名函数从语法上叫函数直接量,javascript语法包括匿名函数的括号,事实上自调用匿名函数有两种写法

第一种

(function(){

})(window);

第二种

(function(){

}(window));

4.为什么要传入window呢?

通过传入window变量,使得window由全局变量变成局部变量,当在jQuery代码块中访问window时,不需要将作用域链回退到顶层作用域,这样可以更快的访问window,更重要的是,window作为参数传入,可以压缩代码进行优化

(function(a,b){

//window被优化为a

})(window);

5.为什么要在参数列表增加undefined呢??

在自调用匿名函数作用域内,确保undefined是真的未定义,因为undefined能够被重写,赋予新的值

undefined = "now it's defined";

alert( undefined );

6.注意到源码最后的分号了吗?

分号是可选的,但省略分号,并不是好的编程习惯,为了更好的兼容在每行代码后加上分号并养成习惯

jQuery() $()

构造函数就是初始化一个实列对象,对象的prototype属性是继承一个实列对象、构造函数注意事项

1、默认函数首字母大写

2、构造函数并没有显示返回任何东西。new操作符会自动创建给定的类型并且返回他们,当调用构造函数时,new会自动创建this对象,类型就是构造函数类型

3、也可以在构造函数中显示调用return.如果返回值是一个对象,他就会替代新创建的对象实列返回,如果返回值是一个原始类型,他就被忽略,新创建实列会被返回。

function Aaa(){}

//一般构造函数

Aaa.prototype.init=function(){alert('init')};

Aaa.prototype.css=function(){alert('css')};

var a1=new Aaa();

a1.init();//初始化

a1.css();

//jquery写法

function jQuery(){

  return new jQuery.prototype.init();

}

jQuery.prototype={

  constructor:jQuery,

  init:function(){/*初始化*/},

  css:function(){console.log('css')}

}

jQuery.prototype.init.prototype=jQuery.prototype;

jQuery().css();

jQuery()->new jQuery.prototype.init();

//把jQuery的原型指向自己的init方法(看做构造函数)的原型上

function jQuery(){

  return new jQuery.prototype.init();

}

jQuery.prototype.init = function(){

};

jQuery.prototype.css = function(){

};

jQuery.prototype.init.prototype = jQuery.prototype;

jQuery().css();