1、突然对jQuery的心血来潮
起因
随着饿百新零售项目一期的告一段落,算是暂时从加班的修罗场里面解放出来了,于是就想搞点事情,正好看项目js库的时候发现了躺在角落的jQuery,想到当初看源码的时候断断续续的没有看完一直是心头的遗憾,于是下定决心把这个遗憾弥补了。
阅读方法
我下载的是jQuery 3.2.1版本,大概瞄了一眼,一万行多一点,由于源码太多,怕看到最后看乱了于是采用看一点删一点的办法,优先看那些没有耦合的静态函数,所以并没有提前制定阅读结构,如果有朋友也在看我这篇文章的话可以也采用我的办法来阅读,可能会更清晰一些。如果读者刚接触前端不就推荐先去看完《js高程》掌握了js的基本概念和方法再来继续阅读。
开始
一、jQuery的结构
jQuery的最外层是一个立即执行函数,这方法在原来没有es6的正式模块化方法之前,几乎所有的js库函数都采用的这种方法来给自己定义全局变量的,利用的是js的闭包原理。js在一开始加载jQuery的时候会立刻执行这个函数,然后利用闭包原理将jQuery本身存在内存中,这样就能够保证jQuery对象在全局访问到了。
jQuery在一开始就采用了最严谨的严格模式来让代码更加规范,这样就会让代码减少出错的机会。
"use strict"
说到jQuery的结构,有必要说说3.0+版本和老版本还有有一些不一样的地方的。直接上图:

如果把现在的jQuery代码和很久以前的版本进行对比的话你会发现结构层有了很大的变化,老版本的jQuery的最外层并没有这么多层的结构,只是一个立即执行函数,然后函数的最后传入了唯一一个变量window,当时的简单结构是由于jQuery库只是应用在浏览器中,所以全局对象只会是Windows,而随着前端的迅速发展,出现了nodejs和不同的模块化规范,jQuery也与时俱进加了这方面的兼容性方案。在立即执行函数最后有一个:
typeof window !== "undefined"? window : this
这个是来判断函数初始化时传入的全局变量是否来自于浏览器的window,如果是就传入window,如果不是就传入未知的全局参数。后面的function则是我们平时用的所有jQuery内定义的方法。
jQuery初始化函数的最顶层有一个判断:
typeof module === "object" && typeof module.exports === "object"
这个是来区分是否来自于类似遵从CommonJS规范,module存在切module.exports要是一个object对象。因为在CommonJS中对外暴漏借口就是类似module.exports.addX = addX。nodejs中使用的就是CommonJS规范,在上图中可以看到根据是否具有CommonJS规范jQuery的初始化参数并不一样。

这里正常的浏览器进来在构建时没有第二个参数,那么这个参数是做什么的呢?

将jQuery源码拉到底部,你会发现最后面有一个上图这样的函数,注释中说的很详细了,这个参数就是来判断是否要将jQuery和$这两个关键字绑定到浏览器全局window上的。
1、突然对jQuery的心血来潮的更多相关文章
- jQuery弹性滑块导航
曾起何时在某网站上看到一弹性滑块导航的效果,瞬间被些效果吸引,开始以为是用FLASH实现的,但查源代码发现用的是JQuery缓动效果. 今天心血来潮想拿这个效果练练手.也看看这段时间学习JS及jque ...
- (转)jquery serialize表单序列化,当radio或checkbox 未选中时,没有序列化到对象中的原因分析和解决方案 - ghostsf
相信很多人都用过jq的表单序列化serialize()方法,因为这能很方便地帮你把表单里所有的非禁用输入控件序列化为 key/value 对象,不需要你再去一个个地拼接参数了. 这是一个很好用的函数, ...
- jQuery 插件开发——countdown(倒计时)
故事背景:按照惯例,先写下故事背景,其实也是再次汇报下最近开发情况的.做电商的都知道,这是个活动季啊,双十一.双十二.元旦....各种啊..其实说这么多就是想表达最近比较忙.呵呵^_^,正好今天抽点空 ...
- [canvas入坑0] Jquery + HTML5 做最简易的画板
查看效果请到 http://philippica.github.io/ 点击paint 嗯,心血来潮想做个东西的一部分 html部分不用多说了,重点就是一个canvas <!DOCTYPE h ...
- 用jquery控制表格奇偶行及活动行颜色
虽然jquery流行已经很多年了,一直都感觉很难,也没有花时间去学习它,只是偶尔哪天心血来潮了去看一点点,时隔多日又会忘得一干二净.最近用到表格奇偶行不同色,不得不去再看jquery,虽然感觉还是难, ...
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧
这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- jQuery实践-网页版2048小游戏
▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
随机推荐
- 学习web前端技术的笔记,仅供自己查阅备忘,图片上传预览
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
Big binary tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- Uva 11729 Commando War (简单贪心)
Uva 11729 Commando War (简单贪心) There is a war and it doesn't look very promising for your country. N ...
- Codeforces Round #415 (Div. 2)(A,暴力,B,贪心,排序)
A. Straight «A» time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- HDU6235-Permutation-水题-2017中国大学生程序设计竞赛-哈尔滨站-重现赛
Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tot ...
- 一步步教你创建自己的数字货币(代币)进行ICO
本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 ...
- centos7 hue安装
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- .NET MongoDB Driver GridFS 2.2原理及使用示例
一.API解读 1 GridFSBucketOptions 1)public string BucketName { get; set; } 获取或设置bucket名称 2)public int Ch ...
- Linux 用户组及用户管理
查看所有组的信息:(信息保存在/etc/group文件中) 其中每段信息用:分割 ,每段的含义如下: 用户名组名:密码:用户组的id:用户组所包含的用户(多个用户用,分割) 查看所有的用户信息:(信息 ...
- CSS3技巧巧妙使用:not(:last-of-type)简化你的css代码
终于找到了一个好方法,使用:not(:last-of-type)简单方便,再也不要麻烦的单独使用:last-of-type了,不错! 应用场景:平时我们的列表一般都会有分割线,但是最后一个列表没有分割 ...