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小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
随机推荐
- 初识DJango——MTV模型
一.Django—MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻 ...
- Codechef:Path Triples On Tree
Path Triples On Tree 题意是求树上都不相交或者都相交的路径三元组数量. 发现blog里没什么树形dp题,也没有cc题,所以来丢一道cc上的树形dp题. 比较暴力,比较恶心 #inc ...
- vijos 1942 [AH 2005] 小岛
描述 西伯利亚北部的寒地,坐落着由 N 个小岛组成的岛屿群,我们把这些小岛依次编号为 1 到 N . 起初,岛屿之间没有任何的航线.后来随着交通的发展,逐渐出现了一些连通两座小岛的航线.例如增加一条在 ...
- Codeforces Round #300(Div. 2)-538A.str.substr 538B.不会 538C.不会 。。。
A. Cutting Banner time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- BZOJ1078: [SCOI2008]斜堆
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1078 每一次进入的点一定是一个极左节点,然后将它所处在的整棵树左右翻转.加上一些情况的处理. ...
- HTML 和 PHP 、MySQL 的交互
为什么要用到数据库? World Wide Web (WWW)不仅仅是一个提供信息的地方.如果你有什么东西,作一个网站,同样可以和全世界的人一起分享.但是,这并不是一件很容易的事.当网站越做越大时,你 ...
- ThoughtWorks University之旅 —— 印度游记
ThoughtWorks University是ThoughtWorks为新加入的员工提供的入职培训项目之一,会将世界各地office新入职的员工一起带到印度浦那,参加一次为期5周的培训,内容涵盖了公 ...
- hset和hget
- Spark算子--distinct
distinct--Transformation类算子 代码示例
- Vue下路由History mode导致页面无法渲染的原因
用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件( ...