起因

随着饿百新零售项目一期的告一段落,算是暂时从加班的修罗场里面解放出来了,于是就想搞点事情,正好看项目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的心血来潮的更多相关文章

  1. jQuery弹性滑块导航

    曾起何时在某网站上看到一弹性滑块导航的效果,瞬间被些效果吸引,开始以为是用FLASH实现的,但查源代码发现用的是JQuery缓动效果. 今天心血来潮想拿这个效果练练手.也看看这段时间学习JS及jque ...

  2. (转)jquery serialize表单序列化,当radio或checkbox 未选中时,没有序列化到对象中的原因分析和解决方案 - ghostsf

    相信很多人都用过jq的表单序列化serialize()方法,因为这能很方便地帮你把表单里所有的非禁用输入控件序列化为 key/value 对象,不需要你再去一个个地拼接参数了. 这是一个很好用的函数, ...

  3. jQuery 插件开发——countdown(倒计时)

    故事背景:按照惯例,先写下故事背景,其实也是再次汇报下最近开发情况的.做电商的都知道,这是个活动季啊,双十一.双十二.元旦....各种啊..其实说这么多就是想表达最近比较忙.呵呵^_^,正好今天抽点空 ...

  4. [canvas入坑0] Jquery + HTML5 做最简易的画板

    查看效果请到 http://philippica.github.io/  点击paint 嗯,心血来潮想做个东西的一部分 html部分不用多说了,重点就是一个canvas <!DOCTYPE h ...

  5. 用jquery控制表格奇偶行及活动行颜色

    虽然jquery流行已经很多年了,一直都感觉很难,也没有花时间去学习它,只是偶尔哪天心血来潮了去看一点点,时隔多日又会忘得一干二净.最近用到表格奇偶行不同色,不得不去再看jquery,虽然感觉还是难, ...

  6. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  7. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧

    这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...

  8. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  9. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

随机推荐

  1. git向码云上传代码总结

    1.下载git windows下载地址:https://git-for-windows.github.io/ 2.安装git 一路确定 3.配置git 如果你要使用ssh上传代码,你需要本地生成ssh ...

  2. 原来你是这样的JAVA[03]-继承、多态、抽象类

    一.继承 Java中的继承使用关键字extends ,跟C#的语法略有差别. 1.子类构造器 java会自动在子类的构造器中插入对父类构造器的调用,也就是说在子类可以访问父类之前已经完成了父类的初始化 ...

  3. Gym 101673F Keeping On Track

    原题传送门 题意:给定一颗n+1(n≤10000)个结点的树(当然有n条边辣),定义一个结点为critical,当且仅当除去这个点及与其相连的边后,所有不相连的结点对数量最多.现在保证有且仅有一个结点 ...

  4. cobaltstrike安装加破解教程+使用教程

    1.先安装java环境= = 1. 下载1.8u121的JAVA JDK (新的java JDK不稳定)!!原因:https://blog.cobaltstrike.com/2017/04/26/ja ...

  5. bzoj:3616: War

    Description 小x所在的世界正在经历一场在k个阵营之间的战争.每个阵营有若干个炮塔,每个炮塔由攻击系统和防御系统组成.第i个炮塔可以攻击到离它欧几里德距离小于等于ri 或者曼哈顿距离小于等于 ...

  6. HDU 1541 树状数组

    树状数组入门博客推荐 http://blog.csdn.net/qq_34374664/article/details/52787481 Stars Time Limit: 2000/1000 MS ...

  7. C语言函数的作用域规则

      “语言的作用域规则”是一组确定一部分代码是否“可见”或可访问另一部分代码和数据的规则. “同一函数中,不同的结构体成员名能相同,当变量处于不同的作用域时,名称可以相同. 注:作用域,其对象是变量, ...

  8. flume1.8 开发指南学习感悟

    概述: Apache Flume是一个分布式.可用的系统,用于从许多不同的sources有效的收集并移动大量日志数据用于集中存储数据. 架构及数据流动模型: flume实际上就是一个Agent.Age ...

  9. Spark环境搭建(中)——Hadoop安装

    1. 下载Hadoop 1.1 官网下载Hadoop http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.9.0/hadoop-2. ...

  10. 将数据按照gzip当时解压的工具类

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; impo ...