jQuery外层包装函数

打开任意一个jQuery的源码js文件,都会看到一个匿名自执行函数,如下代码所示。

//()();自执行函数,定义后立马调用
(function(window, undefined) {//... ...
})(window);

window是一个全局对象,为什么要把window作为参数传递到框架内部?

  • 调用函数栈时,收索变量顺序是从内到外的方式进行。window作为全局对象而言,肯定是最后才收搜到,那么放到内部可以提高速度;
  • js是具有压缩版本compress,那么在jQuery内部使用window时,压缩后会变成单个字符,如e,那么所有使用window的地方都将访问不都window内的属性,从而造成语法错误,而将window作为参数传递,即使jQuery内window被压缩为字符e,但e任然指向window。

undefined为什么要作为参数?

  • undefined是window下的一个属性,其实在早期的浏览器版本中可以对其进行修改,如IE10以下。 如果外部js环境修改了window.undefined值,那么在函数体内部的undefined判断则不成立。

注释use strict

jQuery为什么注释strict模式? 原因:

  1. strict模式好处

    • 在代码中不能使用一些扩展的保留关键字implements、interface、let、package、private、public、static和yield等;
    • with语句不能使用;
    • 不能申明或重写eval和arguments两个标识符;
    • 不能用delete删除显示申明的标识符、名称或函数;
    • 不能申明8进制;
    • 如果语法检测时发现语法问题,则整个代码块失效,并导致语法异常,如检测对象中的重复键、未申明变量、重复的函数参数;
    • 如果在运行期间出现了违反严格模式的代码,则抛出执行异常。
  2. strict模式限制
    • 必须在全局代码或eval代码或函数申明代码或new Function传入的body开始出引入;
    • 限制8进制在IE10以下不支持和FireFox 18以下不支持。

从strict中可以看到好处就是规范js代码的书写规范和语法检查等功能,那么程序员自身能书写规范化的代码前提下使用strict则显得有些画蛇添足。同时有些浏览器本身也不支持strict模式。

jQuery全局变量

在jQuery源码js中的21~94行是var定义的jQuery内的局部全局变量,这里的局部是指jQuery外层包装函数的变量,而全局是jQuery对象而言。包括如下变量:rootjQuery、readyList、core_strundefined、location、document、docElem、_jQuery、_$、class2type、core_deletedIds、core_version、core_concat、core_push、core_slice、core_indexOf、core_toString、core_hasOwn、core_trim和jQuery、core_pnum、core_rnotwhite、rquickExpr、rsingleTag、rmsPrefix、rdashAlpha、completed等26项。26个变量都起到什么作用是开始阅读源码的起始问题,下面我们根据源码中提供的注释进行翻译。

  • rootjQuery 根节点对象
    “A central reference to the root jQuery(document)”意思是jQuery(document)返回的根节点对象的reference引用,也即在870行有个赋值语句,如下。
// 870行 All jQuery objects should point back to these
rootjQuery = jQuery(document);
  • readyList 用于DOM加载的延迟对象
//826行readyList = jQuery.Deferred();
  • core_strundefined 表示undefined的字符形式 ——'undefined'
// Support: IE9 表示IE6/7/8都不支持在xml文档节点中通过
//xmlNode.method !== undefined方式来检查method是否为undefined
// For `typeof xmlNode.method` instead of`xmlNode.method !== undefined`
core_strundefined = typeof undefined
  • window参数对应的属性简写
location = window.location, //URL地址对象
document = window.document, //文档对象
docElem = document.documentElement, //文档HTML元素对象
  • _jQuery、_$保存外部jQuery、$
//356行中的noConflict中,解决外部定义$、jQuery对组件内部的影响。
noConflict: function( deep ) {if ( window.$ === jQuery ) {window.$ = _$;}if ( deep && window.jQuery === jQuery ) {window.jQuery = _jQuery;}return jQuery;
},
  • class2type 一个object的对象字面量,用于存储类型简写键值对。
//847行,将常用类型进行组装成toString类型的键值对缓存
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
  • jQuery版本和通用方法简写
//缓存被删除的
core_deletedIds = [],
core_version = "2.0.3", //jQuery版本
//通过存储对象方法的引用来提高函数查找速度
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,
  • 正则表达式,用于基本的工具表达式
//用于检测数字表达式,如12,12.9,12e10,12.3e3
core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
//用于检测非空白字符,这里\S其实已经一目了然
core_rnotwhite = /\S+/g,
//一种检测选择器是否HTML字符串的正则表达式,关键在于下面的两句话:Prioritize #id over <tag> to avoid XSS via location.hash (#9521);Strict HTML recognition (#11290: must start with <)
//两个子表达式/^(?:\s*(<[\w\W]+>)[^>]*$/和/^#([\w-]*))$/分别是检测HTML字符串、#id选择器
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
//匹配单标签HTML元素,如<input/>、<div></div>
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
//ms表示micro soft,大家应该明白这是啥意思
rmsPrefix = /^-ms-/,
//匹配虚线后的单字符,数据0-9和小写字母a-z
rdashAlpha = /-([\da-z])/gi,
  • camel字符转换函数fcamelCase
//将虚线转换为camel方式的字符,如"a-d"为"a-D",而
fcamelCase = function( all, letter ) {return letter.toUpperCase();
},
//556行,将字符串转换为camel形式的字符串
camelCase: function( string ) {return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
},
  • ready事件处理器complete
completed = function() {//首次清除load加载事件,然后在手动调用jQuery.ready函数document.removeEventListener( "DOMContentLoaded", completed, false );window.removeEventListener( "load", completed, false );jQuery.ready();};
  • jQuery对象构造器
    一般封装组件的构造器是是如何做呢?
//定义组件函数
function myjQuery () {this.name = "myjQuery";
}
//给组件添加功能
myjQuery.prototype.init = function() {//初始化组件
}
//先创建,在初始化组件
var myjQueryObj = new myjQuery();
myjQueryObj.init();

在使用jQuery时,jQuery(…)或$(….)获取jQuery对象,那么jQuery对象是如何创建的?下面的代码看出jQuery对象实际是jQuery.fn.init的对象,而jQuery.fn = jQuery.prototype,所以jQuery对象实际是jQuery原型对象函数属性的对象。

jQuery = function( selector, context ) {// The jQuery object is actually just the init constructor 'enhanced'return new jQuery.fn.init( selector, context, rootjQuery );},

总结

jQuery前期定义了许多变量,有函数、正则表达式和常量。这些变量在jQuery框架中发挥了全局作用,在jQuery框架中作为效率、安全和简便的工具。其中jQuery函数是jQuery框架的构造器,从其中看出jQuery在构造对象独特方式所带来编程的体验感好处。

jQuery的内部全局变量和构造函数相关推荐

  1. vue的组件内部全局变量按照使用的前端id存储历史数据

    为了监控oracle四个库的线程数 需要使用vue组件内部全局变量,局部变量每次会清零 但是四个barline都是一个vuecomponent,因此使用字典数组 <template>< ...

  2. html响应式布局平移,jQuery图片内部缩放和平移插件jquery.zoom.js

    插件描述:jquery.zoom.js是一款非常实用的图片内部缩放和平移jQuery插件.该插件可以鼠标滑过图片,点击图片或移动手机上触摸图片时,将图片进行放大或平移操作. 简要教程 jquery.z ...

  3. 在jquery中的全局变量和局部变量

    1.同级中的局部变量会覆盖全局变量 2.修改全局变量,不在前面加  var 3.局部变量是在前面加  var. 由于 JQ是预加载所以它的执行顺序是按层级(先自上而下执行父级再自上而下执行父级中的子集 ...

  4. 【深入浅出jQuery】源码浅析--整体架构(转)

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  5. jQuery源码研究分析学习笔记-静态方法和属性(10)

    jQuery源码中定义了一些重要的静态属性和方法,它们是其他模块实现的基础,整体的源码结构如下 //把window.jQuery和winow.$备份到局部变量_jQuery和_$_jQuery = w ...

  6. jQuery 中 data 方法的实现原理

    jQuery 中 data 方法的实现原理 前言:jQuery 作为前端使用最多最广泛的 JS 库,其源码每个 JSer 都应该研究一下.早就打算看却一直被各种事拖着,上次某公司面试时被问到 jQue ...

  7. jQuery技术内幕:深入解析jQuery架构设计与实现原理1

    jQuery技术内幕:深入解析jQuery架构设计与实现原理 高 云 著 图书在版编目(CIP)数据 jQuery技术内幕:深入解析jQuery架构设计与实现原理 / 高云著. -北京:机械工业出版社 ...

  8. jQuery源码解析(架构与依赖模块)

    jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1. ...

  9. jquery 这些小技巧你懂吗

    jquery有很多奇淫技巧,它的结构清晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性. 这里仅对其中的一些小技巧做个总结. 1.jquery闭包 把当前沙箱需要的外部变量通过函数参数引入进来 只要保 ...

最新文章

  1. 如何设计一款地震高岗一派溪山千古秀的反爬虫?
  2. CNN更新换代!性能提升算力减半,还即插即用(附论文)
  3. 重磅突发!全球首富40颗卫星遭摧毁
  4. Python之路----迭代器与生成器
  5. Docker增强Container的安全性
  6. Web 仿 App 动画竟然引出了“性能杀手”
  7. Linux中修改登录提示文件
  8. LeetCode 552. 学生出勤记录 II(动态规划)
  9. elasticsearch 查看索引_ElasticSearch 索引基本操作
  10. ionic4 ios打开appstore 跳转第三方app
  11. openGL之API学习(二零七)glTexCoordPointer
  12. Android——横幅通知
  13. 腾讯新版 Windows QQ 首个公测版发布,采用全新 QQ NT 架构
  14. DDoS 攻击的趋势
  15. 流媒体学习-WebRTC全面入门学习-1
  16. 网络带宽---(上)
  17. [MySQL]复杂查询(进阶)
  18. 全球行情_全球股市中心
  19. 读书笔记 Believe It to Achieve It by Brian Tracy and Christina Stein, Ph.D.
  20. Visual Studio 2022中kbhit()函数与getch()函数的书写问题

热门文章

  1. PowerPoint 2019无法插入Microsoft Web Browser控件
  2. 迅捷CAD看图怎么快速查看图纸呢?
  3. 都会演出连城诀—诺基亚N78决战入手入手了!
  4. php 正则表达式 菜鸟,正则表达式菜鸟教程.pdf
  5. python爬微博数据中心_怎样用python爬新浪微博大V所有数据?
  6. CPU卡设计实例及程序设计(二十九)卡82H外部认证,ESAM04H,05H,06H外部认证
  7. ECS(centos7)安装erlang再安装rabbitmq报错erlang >= 23.2 is needed by rabbitmq-server-3.9.5-1.el7.noarch
  8. MixZle Lite:动手又动脑的益智投球游戏
  9. 二十一世纪初厦门文物艺术品市场的繁荣
  10. 组态王怎么做进度条_三种方法制作进度条效果