2.1.bug通过索引查询

这里的#13335是bug的索引,如何查询呢?

第一步,浏览器地址栏输入"https://bugs.jquery.com/"。

第二步,在网页的搜索框里输入索引值,那么就可以查询bug的更改历史(changelogs)了。

2.2 "use strict",不使用严格模式(20行)

代码不规范就会报错。IE的低版本并不支持,火狐可能假死。所以,这一行是一条注释,并不提倡使用。

"use strict";

a=10;

//报错,Uncaught ReferenceError: a is not defined。必须添加上var。还有很多严格模式的报错,不细说。

2.3.变量rootjQuery

根据注释 // A central reference to the root jQuery(document) 说明他是一个指向document的根对象。搜索一下rootjQuery,866行, rootjQuery = jQuery(document); 接下来需要了解的是为什么要使用变量的形式,变量能将值语义化。 a=a+10; 这里并不知道10是什么东西,可是如果写成 var iSpeed=10; 那么可维护性和可读性会更高。

2.4.变量readyList

根据注释 // The deferred used on DOM ready 说明他是一个DOM加载时使用的延迟对象。

2.5.判断undefined的类型

代码 core_strundefined = typeof undefined 究竟有什么意图呢?这是在解决一个小众的bug。比如要判断a属性有没有被定义为window的属性,可以使用 window.a=="undefined"; 和 typeof window.a=="undefined"; 两种方式。可是第一种方式是有兼容问题的,第二种才是全能的。正如注释所说, // Support: IE9,For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` 老版本的IE(6、7、8、9)在第一种方式上有兼容问题,为什么注释里写的是IE9,因为这里的源码版本是2.0.3,所以就不谈IE6、7、8。所以用typeof替代掉直接的逻辑判断。

2.6.变量location、document和docEle的保存

 // Use the correct document accordingly with window argument (sandbox)通过window参数来使用正确的document

location = window.location,

document = window.document,

docElem = document.documentElement,

现实中的沙箱,是一种儿童玩具,类如KFC中一个装满小球的容器,儿童可以在随意玩耍,起到保护儿童的作用。所以可以理解为安全环境。从代码的角度上说好处是把某些要用的属性用变量保存下来,那么压缩的时候就会变成字母。location是网址对象,document是document对象,docEle是html元素。

2.7.变量_jQuery、_$的保存、class2Type对象、core_deletedIds数组的定义

// Map over jQuery in case of overwrite 映射到jQuery以覆盖。 // Map over the $ in case of overwrite 映射到$以覆盖。说到这里,不得不说,jQuery框架提供给外部的方法是$()和jQuery(),而两个变量的作用是防止冲突。具体防冲突的方法在349行-817行的jQuery.extend()工具方法。class2type是$.type要用到的一个对象变量,用来存一些值。

// List of deleted data cache ids, so we can reuse them 说core_deletedIds是用来罗列删除的数据缓存id,所以我们可以重复使用它们。太棒了!

2.8.core_打头的局部变量存储

// Save a reference to some core methods 存储一些core方法的引用。变量的存储,方便使用(字符串更简洁),而且方便压缩。

core_version = "2.0.3",//存储了版本号

core_concat = core_deletedIds.concat,//数组的concat(合并)方法

core_push = core_deletedIds.push,//数组的push方法

core_slice = core_deletedIds.slice,//数组的slice方法

core_indexOf = core_deletedIds.indexOf,

core_toString = class2type.toString,//对象的toString方法

core_hasOwn = class2type.hasOwnProperty,

core_trim = core_version.trim,//trim是字符串的方法,去掉字符串首尾空格

需要说明的事trim方法。在老版本浏览器trim方法是没有的,所以要通过正则把首尾空格去掉。高级浏览器就有trim方法了,所以可以直接来用。这里的jQuery版本2.0.3是放弃了IE6、7、8的,所以这里可以直接使用trim方法。

有首尾空格的代码:alert("("+" 123456 "+")"); 它的显示效果是有空格的字符串。

使用了trim方法的代码: alert("("+" 123456 ".trim()+")"); ,它的显示效果是去掉首尾空格的。

2.9 jQuery函数

 jQuery = function( selector, context ) {

// The jQuery object is actually just the init constructor 'enhanced'

//jQuery对象实际上,仅仅是初始化构造器的增强版本。

         return new jQuery.fn.init( selector, context, rootjQuery );

},

jQuery函数通过8826行的  window.jQuery=window.$=jQuery; 暴露给外部jQuery的接口。对外提供的接口就是 $() 或者 jQuery() 。可以看到jQuery返回的是一个对象,所以后面可以接方法,包括链式调用,比如 $("#div1").css(); 。我们看见jQuery.fn.init,因为在 jQuery.fn = jQuery.prototype = {96行说的是prototype是fn,所以就是在原型上找init函数。

普通的面向对象写法是通过protoype写init和css方法,为了调用css方法需要先用new方法写构造器,然后使用init方法调用,最后才能调用到css方法。

function Aaa(){

}

Aaa.prototype.init=function(){
//初始化
}
Aaa.prototype.css=function(){ } var al=new Aaa(); al.init(); al.css()

jQuery的面向对象写法是非常巧妙的,最终让$().css()能够成功找到css方法。

 function jQuery(){

     return new jQuery.prototype.init();

}

jQuery.prototype.init=function(){

 };

 jQuery.prototype.css=function(){

 };
jQuery.fn.init.prototype = jQuery.fn;//fn也就是protoype。283行。
jQuery().css();

//调用jQuery()返回的是jQuery.prototype(jQuery原型)的init函数的原型构造器。它呢由于283行的赋值,所以刚刚的值就是jQuery.prototype。

//如上,调用jQuery()。得到的结果是jQuery.prototype。所以css就可以通过jQuery().css()。

2.10 正则有关的变量

关于core_pnum的正则, // Used for matching numbers 用来匹配数字的,比如正数啊、负数啊,有没有小数点,以及科学计数法。到css方法的时候要设置宽和高,要用到数字。

core_rnotwhite = /\S+/g, 这个正则呢, // Used for splitting on whitespace 是当字符串要用空格分割一下。  // A simple way to check for HTML strings // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr是一个简单的方式来检查HTML字符串,前面部分是匹配标签,后面部分是匹配id。它可以用来防XSS注入。rsingleTag是匹配独立的标签。

msPrefix的ms是IE浏览器前缀,它跟其他浏览器前缀有区别。css中的margin-left在html DOM的属性是marginLeft。-webkit-margin-left在HTML DOM的属性是webkitMarginLeft。而-ms-margin-left在html DOM的属性是MsMarginLeft。rdashAlpha匹配的比如-2d,会修改为2d。

2.11 回调函数fcamelCase和completed

fcamelCase在jQuery.camelCase作为回调函数使用。completed是ready事件的处理器和自身的清除方法。

jquery的2.0.3版本源码系列(2):21行-94行定义了一些变量和函数 jQuery=function(){}的更多相关文章

  1. jquery的2.0.3版本源码系列(1)总体结构

    为什么选择2.X版本,而不是1.X版本,因为2.X不兼容IE6/7/8,所以少了兼容代码,让我们更专注于jquery原理的代码. 一共有8830行. 1.1 匿名函数自执行 首先,匿名函数的作用是,把 ...

  2. jquery的2.0.3版本源码系列(6):2880-3042行,回调对象,对函数的统一管理

    目录 1 . 回调对象callbacks的演示 回调的使用有一点像事件绑定,先绑定好,等到有点击事件或者其他时就触发. <script src="js/jquery-2.0.3.js& ...

  3. jquery的2.0.3版本源码系列(4):285-348行,extend方法详解

    目录 1 . jquery extend的基本使用 通过285行的源码 jQuery.extend = jQuery.fn.extend = function() { ,extend方法要么是直接挂在 ...

  4. jquery的2.0.3版本源码系列(7):3043行-3183行,deferred延迟对象,对异步的统一管理

    目录 part1 deferred延迟对象 part2  when辅助方法 网盘源代码 链接: https://pan.baidu.com/s/1skAj8Jj 密码: izta part1 defe ...

  5. jquery的2.0.3版本源码系列(3):96行-283行,给JQ对象,添加一些方法和属性

    jquery是面向对象的程序,面向对象就离不开方法和属性. 方法的简化 jQuery.fn=jQuery.prototype={ jquery: 版本 constructor: 修正指向问题 init ...

  6. jquery的2.0.3版本源码系列(5):349-817行,extend添加的工具方法

    expando 生成唯一JQ字符串(内部)noconflict避免冲突isReady DOM是否加载完成(DOMContentLoaded)readyReady

  7. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  8. Kafka 0.10.1版本源码 Idea编译

    Kafka 0.10.1版本源码 Idea编译 1.环境准备 Jdk 1.8 Scala 2.11.12:下载scala-2.11.12.msi并配置环境变量 Gradle 5.6.4: 下载Grad ...

  9. spring各个版本源码

    各版本源码下载地址 http://maven.springframework.org/release/org/springframework/spring/

随机推荐

  1. [Open Source] .NET 基于StackExchange.Redis的扩展

    目录 简介 主从复制 备份与恢复 API AddOrUpdate GetOrAdd DeleteByPattern SearchKeys TransExcute Subscribe/Publish T ...

  2. npm介绍与cnpm介绍

    npm介绍 说明:npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等) 使用npm安装插件:命令提示符执行npm instal ...

  3. Linux,activemq-cpp之消息过滤器

    假设过滤器字符串如下: filt1=aaaa filt2=bbbb filt3=cccc activeMQ-cpp中消息过滤器,在发送消息的producer.cpp中,对message进行属性设置,m ...

  4. MySql的事务隔离级别

    一,未提交读 顾名思义,未提交读就是能够读取到事务尚未提交所产生的数据.这种隔离方式会产生一种问题就是“脏读”. 脏读: 比方说有两个事务A B   在A事务里面将数据的id更改为2,但是A事务尚未提 ...

  5. MySQL优化 - 性能分析与查询优化

    优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载选择合理的硬件配置等. 1.性能分析 性能分析包含 ...

  6. 【机器学习】反向传播算法 BP

    知识回顾 1:首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络的层数,S表示每层输入的神经元的个数,SL代表最后一层中处理的单元 ...

  7. 阿里消息队列中间件 RocketMQ源码解析:Message发送&接收

  8. 4. leetcode 461. Hamming Distance

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  9. ASP.NET Core MVC Tag Helpers 介绍

    简介 Tag Helpers 提供了在视图中更改和增强现有HTML元素的功能.将它们添加到视图中,会经过Razor模板引擎处理并创建一个HTML,之后再返回给浏览器.有一些Tag Helpers,其实 ...

  10. BFS:noi6044鸣人与佐助

    PS:一道XX到我心态崩溃的好(傻逼)题. 先粘题目: 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过 ...