菜鸟的jQuery源码学习笔记(一)

时间:2022-12-02 19:18:21

整个jQuery是一个自调用的匿名函数:

 1 (function(global, factory) {
 2     if (typeof module === "object" && typeof module.exports === "object") {
 3         module.exports = global.document ?
 4             factory(global, true) :
 5             function(w) {
 6                 if (!w.document) {
 7                     throw new Error("jQuery requires a window with a document");
 8                 }
 9                 return factory(w);
10             };
11     } else {
12         factory(global);
13     }
14 }(typeof window !== "undefined" ? window : this, function(window, noGlobal) {
15                            /* jQuery主体代码 */
16 }));

自调用函数大家都不陌生,前面的function(){}是函数定义,然后紧接着的()表示立即执行,这样构建了一个命名空间,其中的变量都是局部变量,不管起什么名字,都不会覆盖全局变量。这样就不会污染全局的命名空间。如果有不熟悉的同学,可以去看看作用域链和闭包的基础知识就明白啦。

这个子调用函数的函数体我们暂时可以不用管,貌似是处理jQuery与CommonJS、Node.js等的冲突和协调关系,这个我觉得不是重点,重点是这个自调用函数的参数。

整个参数列表有两个参数,第一个参数是传入Global对象,所有的全局变量都是Global对象的成员。传入这个变量,我们就将Global对象变成了这个自调用匿名函数的局部变量了,这样当我们访问它时,在自调用匿名函数的作用域中就能找到它,而不用将作用域链会退到Global,这样就更快啦。

第二个参数就是我们的jQuery啦,其中定义了jQuery的所有的内容,咱们的重点就在这里,那么现在开始,我们往下看。

1 jQuery = function(selector, context) {
2             // The jQuery object is actually just the init constructor 'enhanced'
3             // Need init if jQuery is called (just allow error to be thrown if not included)
4             return new jQuery.fn.init(selector, context);
5         }

在自调用的匿名函数里面,定义了一个jQuery变量,它是一个方法,执行后返回一个新jQuery对象,不过这个对象实际上是由jQuery.fn.init函数构建。在整个jQuery主体代码的最后会让window.jQuery和window.$两个全局变量引用这个jQuery方法:

1 if (typeof noGlobal === strundefined) {
2         window.jQuery = window.$ = jQuery;
3     }

这样当我们使用$(...)或者jQuery(...)的时候就能创建jQuery对象啦!

下期预告:

我们都知道,在javascript中构建对象的方法有很多种,什么工厂模式、构造函数模式、原型模式等等,jQuery使用的是构造函数和原型相结合的方式。下期我们来看看jQuery的原型是怎么样的。