jQuery 源码分析笔记

   2015-11-13 0
核心提示:jQuery 最新版本1.6.1的时间戳2011年5月12日。开发未压缩版本229KB,共8937行代码。
jQuery的宗旨是Write Less, Do More。它对JavaScript的开发风格侵入性不如YUI那么强,当然也不如Dojo和YUI如此庞大。它极大的简化了JavaScript的日常开发工作,主要是DOM元素的操作(从名字Query就可以看出)。另外一个主要工作就是每个前端开发者都需要面对的浏览器兼容性。jQuery兼容所有主流浏览器的大部分版本,从万恶的IE6开始直到Firefox,Chrome等现代浏览器。除了居于核心的一小部分代码之外,剩下的jQuery都是松散的函数,扩展性很强。http://plugins.jquery.com上有成千上万的jQuery插件,你需要的功能几乎都有对应的jQuery插件,而且不止一个。
jQuery代码的头部是License声明。采用了GPLv2和MIT双协议。而在jQuery声明下是另一个项目的声明:Sizzle。这是jQuery作者另外的一个开源项目,在MIT、BSD和GPL下发布。它是一个独立的selector实现(pure-JavaScript CSS selector engine),可以独立使用。它的压缩版本只有3KB多一点,号称效率最高的选择器实现。jQuery从1.3开始使用Sizzle代替了原来的selector实现。
JS代码中有大量的()和{},这里使用的是Vim阅读,因为%命令可以快速的找到匹配的括号。
代码总体结构和变量
jQuery的代码整体上就是一个匿名函数调用:
复制代码 代码如下:

(function (window, undefined) {
// ...
})(window);

这是为了避免污染全局对象,同时也可以方便的管理执行上下文。这个技巧在JS代码中经常见到,在jQuery代码中也很常见。比如,在jQuery和其他JS库同时使用时,$符号可能已经被使用了。为了仍然使用$符号:
复制代码 代码如下:

(function ($) {
// $("...")... 照常使用$
})(jQuery);

在这里传入真正的jQuery对象。
下面进入真正的实现部分,首先是$,也就是jQuery对象的声明,其中最基本的两个成员也列出来了:
复制代码 代码如下:

var jQuery = (function() {
var jQuery = function(selector, context) {
// 真正的初始化函数
return new jQuery.fn.init(selector, context, rootjQuery);
},
// 一大堆变量声明
// fn是主要的函数实现点,也是jQuery插件的起点。实际上就是JS原型
jQuery.fn = jQuery.prototype = {
};
// 一个扩展对象用的函数,可以动态地往对象上加成员。以后往jQuery里面加成员都是用extend函数完成的。
jQuery.extend = jQuery.fn.extend = function() {
};
// ...
return jQuery;
})();

jQuery对象是核心对象,所有$(...)得到的都是jQuery对象,除了少部分直接实现在jQuery下的Utility函数之外,大部分函数都是用extend方法加到jQuery对象里的。
 
标签: 源码分析
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • skynet源码分析之网络层——Lua层介绍
    本篇主要介绍在Lua服务里调用skynet网络层底层接口的流程,Lua层的api主要在lualib/skynet/socket.lua,可参考官方wiki https://github.com/cloudwu/skynet/wiki/Socket。通过一个简单的例子说明Lua服务是如何最终调用到网络层底层接口的: 1local socket =
    02-09
  • C语言使用realloc函数实现通讯录源码分析
    目录一、ContactInit初始化二、ContactCheckCapacity检查通讯录内存是否够用三、ContactDistory释放动态开辟的空间四、源码一、ContactInit初始化void ContactInit(Contact* ps)//初始化{ps-size = 0;ps-capacity = 0;ps-data = NULL;}初始化的时候,就不再使
  • Java并发源码分析ConcurrentHashMap线程集合
    目录简介常量构造方法putinitTabletabAtcasTabAthelpTransferputTreeVal锁状态lockRootcontendedLocktreeifyBinTreeBinaddCountfullAddCounttransfer简介ConcurrentHashMap是一个线程安全的集合,底层是通过对指定索引位置上的节点进行加锁,而不是对整个数组加
  • Go Excelize API源码分析SetSheetViewOptions
    Go Excelize API源码分析SetSheetViewOptions
    这篇“Go Excelize API源码分析SetSheetViewOptions”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go Excelize API源码分析Set
    02-09 goexcelize
  • 浅析 ruby on rails 中的事务嵌套 源码分析
    浅析 ruby on rails 中的事务嵌套 源码分析
    源代码分析首先看 transaction 方法 ActiveRecord::Transactions Public Class methods     # File vendor/rails/activerecord/lib/active_record/transactions.rb, line 187187:     def transaction(block)188:       self.class.
    02-08
  • Java定时器Timer的源码分析
    Java定时器Timer的源码分析
    目录一、TimerTask1. 任务状态2. 任务属性说明3. 任务方法说明二、Timer1. sched方法2. cancel方法3. purge方法三、TaskQueue四、TimerThread通过源码分析,我们可以更深入的了解其底层原理。对于JDK自带的定时器,主要涉及TimerTask类、Timer类、TimerQueue
    02-08 JavaTimer
  • PowerUsageSummary.java源码分析
    PowerUsageSummary.java源码分析
    在在线网站http://androidxref.com/上对Android版本6.0.1_r10源码进行分析官方手机的应用耗电排行具体实现位置在:/packages/apps/Settings/src/com/android/settings/fuelgauge/PowerUsageSummary.javaPowerUsageSummary类的作用是筛选耗电量最多的前十个应
    02-08
  • k8s client-go源码分析 informer源码分析(6)-Indexer源码分析
    k8s client-go源码分析 informer源码分析(6)-In
    informers实现了持续获取集群的所有资源对象、监听集群的资源对象变化功能,并在本地维护了全量资源对象的内存缓存,以减少对apiserver、对etcd的请求压力。Informers在启动的时候会首先在客户端调用List接口来获取全量的对象集合,然后通过Watch接口来获取增
  • dvwa 源码分析(二) --- dvwaPage.inc.php分析
    在setup.php中,包含了这个文件,所以这里分析这个文件。 1 ?php 23 if( !defined( 'DVWA_WEB_PAGE_TO_ROOT' ) ) { 45 define( 'DVWA System error- WEB_PAGE_TO_ROOT undefined' ); 6 exit; 78 } 9 10 11 session_start(); // Creates a 'Full Path Disclosu
    02-08
  • Thinkphp3源码分析(2)
    上次分析完了ThinkPHP3的入口文件(index.php),按照TP3源码的文件加载的顺序,今天开始分析path/ThinkPHP/ThinkPHP.php文件。为了方便解释,我直接先将path/ThinkPHP/ThinkPHP.php文件中的内容先粘贴出来(在代码中,我会加上自己理解的注释)。/--------------
点击排行