菜鸟的jQuery源码学习笔记(一)
整个jQuery是一个自调用的匿名函数:
(function(global, factory) {
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = global.document ?
factory(global, true) :
function(w) {
if (!w.document) {
throw new Error("jQuery requires a window with a document");
}
return factory(w);
};
} else {
factory(global);
}
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) {
/* jQuery主体代码 */
}));
自调用函数大家都不陌生,前面的function(){}是函数定义,然后紧接着的()表示立即执行,这样构建了一个命名空间,其中的变量都是局部变量,不管起什么名字,都不会覆盖全局变量。这样就不会污染全局的命名空间。如果有不熟悉的同学,可以去看看作用域链和闭包的基础知识就明白啦。
这个子调用函数的函数体我们暂时可以不用管,貌似是处理jQuery与CommonJS、Node.js等的冲突和协调关系,这个我觉得不是重点,重点是这个自调用函数的参数。
整个参数列表有两个参数,第一个参数是传入Global对象,所有的全局变量都是Global对象的成员。传入这个变量,我们就将Global对象变成了这个自调用匿名函数的局部变量了,这样当我们访问它时,在自调用匿名函数的作用域中就能找到它,而不用将作用域链会退到Global,这样就更快啦。
第二个参数就是我们的jQuery啦,其中定义了jQuery的所有的内容,咱们的重点就在这里,那么现在开始,我们往下看。
jQuery = function(selector, context) {
// The jQuery object is actually just the init constructor 'enhanced'
// Need init if jQuery is called (just allow error to be thrown if not included)
return new jQuery.fn.init(selector, context);
}
在自调用的匿名函数里面,定义了一个jQuery变量,它是一个方法,执行后返回一个新jQuery对象,不过这个对象实际上是由jQuery.fn.init函数构建。在整个jQuery主体代码的最后会让window.jQuery和window.$两个全局变量引用这个jQuery方法:
if (typeof noGlobal === strundefined) {
window.jQuery = window.$ = jQuery;
}
这样当我们使用$(...)或者jQuery(...)的时候就能创建jQuery对象啦!
下期预告:
我们都知道,在javascript中构建对象的方法有很多种,什么工厂模式、构造函数模式、原型模式等等,jQuery使用的是构造函数和原型相结合的方式。下期我们来看看jQuery的原型是怎么样的。
菜鸟的jQuery源码学习笔记(一)的更多相关文章
- 菜鸟的jQuery源码学习笔记(前言)
前言 相信任何一名前端开发人员或者是前端爱好者都对jQuery不陌生.jQuery简单易用,功能强大,特别是拥有良好的浏览器兼容性,大大降低了前端开发的难度,使得前端开发变得“平易近人起来”.自从本人 ...
- 菜鸟的jQuery源码学习笔记(二)
jQuery对象是使用构造函数和原型模式相结合的方式创建的.现在来看看jQuery的原型对象jQuery.prototype: jQuery.fn = jQuery.prototype = { //成 ...
- 菜鸟的jQuery源码学习笔记(三)
each: function(callback, args) { return jQuery.each(this, callback, args); }, each:这个调用了jQuery.each方 ...
- jquery源码学习笔记三:jQuery工厂剖析
jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...
- jQuery源码学习笔记一
学习jQuery源码,我主要是通过妙味视频上学习的.这里将所有的源码分析,还有一些自己弄懂过程中的方法及示例整理出来,供大家参考. 我用的jquery v2.0.3版本. var rootjQuery ...
- jquery源码学习笔记二:jQuery工厂
笔记一里记录,jQuery的总体结构如下: (function( global, factory ) { //调用factory(工厂)生成jQuery实例 factory( global ); }( ...
- jquery源码学习笔记(一)jQuery的无new构建
本人是一名.net程序员..... 你一个.net coder 看什么jQuery 源码啊? 原因吗,很简单.技多不压身吗(麻蛋,前端工作好高...羡慕). 我一直都很喜欢JavaScript,废话不 ...
- jquery源码学习笔记一:总体结构
练武不练功,到老一场空.计算机也一样. 计算机的功,就是原理.如果程序员只会使用各种函数,各种框架,而不知其原理,顶多熟练工人而已.知其然,更要知其所以然. jquery我们用得很爽,但它究竟咋实现的 ...
- jQuery源码学习笔记二
//添加实例属性和方法 jQuery.fn = jQuery.prototype = { // 版本,使用方式:$().jquery弹出当前引入的jquery的版本 jquery: core_vers ...
随机推荐
- redis学习研究--Redis作者谈Redis应用场景
毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象 ...
- 【mysql】1206 SQLSTATE: HY000 (ER_LOCK_TABLE_FULL) 问题
最近在做一个项目,其中一需求是:部分数据库中的数据需要定时删除掉(满足一定条件,比如7天前的数据都不保留) 最初的执行方法: 使用Quartz定时执行数据库操作,进行数据删除,数据库操作使用delet ...
- ActionSupport.getText()方法 以及 js中:<s:text name="" />
下面略述com.opensymphony.xwork2.ActionSupport.getText()方法 public String getText(String aTextName) 说明:Get ...
- <正见>摘抄
1- 没有全能的力量能够扭转死亡之路,因此也就不会困在期待之中.如果没有盲目的期待,就不会有失望,如果能够了解一切都是无常,就不会攀缘执著.如果不攀缘执著,就不会患得患失,也才能真正完完全全地活着. ...
- nginx+mysql+php
根据生产环境安装操作系统(centos 6.0 64位系统),安装完成后,使用Xshell通过ssh协议连接服务器.ssh 用户名@IP+回车+输入密码后登录系统.#mkdir -p /home/to ...
- C语言基础10
栈区间:在函数内部声明的变量都存放在栈区间,比如int char 数组 结构体 指针,只管申请,系统会自动帮我们回收,收回的时间是作用域结束之后,遵循的原则是"先进后出". int ...
- inotifywait实现目录监控
http://blog.csdn.net/firefoxbug/article/details/8188804
- error: ‘shared_ptr’ in namespace ‘std’ does not name a type
用G++编译项目的时候发生标题上的错误,原因是,这是c++ 11标准的.在给g++传递命令行的时候加上-std=c++0x就行了. 还需要在源码中#include<memory> 我的cm ...
- FZU 1856 The Troop (JAVA高精度)
Problem 1856 The Troop Accept: 72 Submit: 245Time Limit: 1000 mSec Memory Limit : 32768 KB Pro ...
- 类linux系统/proc/sysrq-trigger文件功能作用
立即重启计算机 echo "b" > /proc/sysrq-trigger 立即关闭计算机 echo "o" > /proc/ ...