要搞明白的问题:
1.
2.
第一个问题:jQuery框架的最外层是可自动执行的闭包方法,该闭包方法执行结束后可以通过该闭包向外提供的接口(window命名空间内的变量)来继续调用闭包内的成员变量。该笔包只设定了jQuery和它的简称作为window的变量,故而,jQuery库仅向外提供了两个接口,或者说是两个命名空间。
第二个问题:jQuery类的结构:
通常想到的得到$对象的方式肯定是:new $(arg),这样设计是可以,但哪里有$(arg)更方便。
为了实现用$(arg)方法得到$对象的方法,势必要在$函数体内返回$对象,如果调用$方法的上下文是$,那么就可以直接返回$,可是调用$方法的上下文是window,那么只能在$方法中再new一个$对象了。如:
$=function(arg){return new $(arg);};
如上,死循环啦。
作者用了另一种方法实现了。他定义了另一个方法init,init和$方法的原型指向同一对象,则init对象和$对象的类型就是相同的,用instanceof检测时是一样的。现在就可以这样:
$=function(arg){return new init(arg);};
搞定,$的原型对象中定义了$对象的基本成员,init方法中进一步通过this.prop=value;的方式定义了$对象的其他属性。
纵观整个jQuery框架代码,不仅只有两个window全局变量,而且局部变量也封装的很好,jQuery的功能可以分成多个模块,除了少数的多模块公用的变量(如正则表达式)及方法(如$.extend)外,基本上都是将一个模块的局部变量封装在一个子命名空间内(通过$.extend(args)方法实现)。init方法只在生成$对象时用到,不应作为$空间的成员,而放入另一子空间$.fn就合适多了。
上述中$=function(arg){return new init(arg);};的理解牵涉到对javascript语言中实例化过程的理解。请见另一篇对javascript语言中实例化过程的理解