你的浏览器不支持canvas

Enjoy life!

jQuery - 代码分析之变量

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

其他链接:

一、最外部的IIFE

(function(window, undefined) {
  // 不要在这里直接用window,而是传参
})(window)

这里有三点需要注意的:

1.1 使用IIFE(立即执行函数表达式)

  • 原因:所有变量都是局部变量,不会与外部产生变量冲突

1.2 传进参数window

  • 原因:
    1. 尽管window对象处于最顶端的对象,但在沿着作用域链查找变量的过程中,查找window对象往往是最慢的。 但是,如果我们将window对象当成参数传进去,根据变量查找规则,最先往作用域链的最前端去查找, 因此,我们不需要再往最顶端寻找window对象,而是只需要找到IIFE中的参数window就好。 【简单来说,传参后查找变量的速度要比不传参的快

    2. 其实我们不传window对象,直接在IIFE里使用window对象也是可以的,但当在压缩代码的时候,写在IIFE里 的 window尽管可以压缩,但是你并不知道这个压缩后的window是什么来的。相反,如果你将window传到IIFE里, 参数window是可以压缩的,但由于window是存在的,所以即使参数window压缩了,我们也知道压缩后的它是什么来的。 【简单来说,传参后,即使压缩了,也可以知道压缩后的代码是什么意思

1.3 传进参数undefined

    var undefined = 10;
    alert(undefined);
  • ie较低版本下,弹出的是10;在ie10,弹出的是undefined
  • 因此,传undefined是为了防止外部修改undefined的值,恰好又有一些浏览器默认可以修改undefined的值

二、变量

2.1 rootjQuery

// A central reference to the root jQuery(document)
var  rootjQuery;

// 第866行
rootjQuery = jQuery(document);
  • 为什么获取document对象也要拿一个变量将其存储起来呢?
    • 原因:压缩代码的时候,jQuery(document)一般不能压缩,而rootjQuery可以压缩,并且我们调用document起来会比较方便

2.2 readyList

// The deferred used on DOM ready
var readyList;
  • 这个变量与DOM有关,以后解释

2.3 core_strundefined

// Support: IE9
// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
var  core_strundefined = typeof undefined;
  • 其实我们验证一个变量是否为undefined有两种方法:
    1. window.a == 'undefined';
    2. type window.a =='undefined'
  • 但在jq中选择第二种写法,是因为第一种写法在浏览器兼容上有些问题,例如低版本的ie可能无法正确判断一个变量是否为undefined

2.4 location、document、docElem

 // Use the correct document accordingly with window argument (sandbox)
var location = window.location,
    document = window.document,
    docElem = document.documentElement;
  • 用变量存起来,也是为了代码的压缩

2.5 _jQuery_$

var
 // Map over jQuery in case of overwrite
_jQuery = window.jQuery,

// Map over the $ in case of overwrite
_$ = window.$;
  • 这两个变量都是为了防冲突而使用的。

2.6 class2type

// [[Class]] -> type pairs
var class2type = {};

// 其实class2Type就是按以下格式存储以下内容
class2type = {
    '[Object String': 'string',
    '[Object Array': 'array'
}
  • 这个变量将要在$.type()方法中用到,这个方法主要用来判断类型的。

2.7

var 
// List of deleted data cache ids, so we can reuse them
// 在jq2.0版本以上,这个变量已经没什么用处了,数据的缓存与“data”有关。
core_deletedIds = [],

// 版本号
core_version = "2.0.3",

// Save a reference to some core methods
// 变量存储,使用方便,压缩方便
core_concat = core_deletedIds.concat,
core_push = core_deletedIds.push,
core_slice = core_deletedIds.slice,
core_indexOf = core_deletedIds.indexOf,
core_toString = class2type.toString,
core_hasOwn = class2type.hasOwnProperty,
core_trim = core_version.trim;

2.8 fcamelCase

// Used by jQuery.camelCase as callback to replace()
var fcamelCase = function( all, letter ) {
    return letter.toUpperCase();
};

2.9 completed

// The ready event handler and self cleanup method
var completed = function() {
    document.removeEventListener( "DOMContentLoaded", completed, false );
    window.removeEventListener( "load", completed, false );
    jQuery.ready();
};

三、变量 — 正则部分

3.1 core_pnum

  • 用来匹配数字
 // Used for matching numbers
var core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;

3.2 core_rnotwhite

  • 用来匹配数字
 // Used for splitting on whitespace
var core_rnotwhite = /\S+/g;

3.3 rquickExpr

  • 用来匹配类似<p>xxx 或者 #div1
// 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 <)
var rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;

3.4 rsingleTag

  • 用来成对出现的标签,例:<p></p>
// Match a standalone tag
var rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;

3.5 rmsPrefix

  • -ms-ie的前缀,如果是-ms-margin-left-缩写后是MsMarginLeft,不像webkitMarginLeft的第一个字母是小写,所以这个要重点拿出来
// Matches dashed string for camelizing
var rmsPrefix = /^-ms-/;

3.6 rdashAlpha

  • 用来匹配-1xx或者-mm
    • 例:margin-left中的-left就可以匹配到,我们可以将其转化成marginLeft这样的形式
var rdashAlpha = /-([\da-z])/gi;

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。