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小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...
随机推荐
- JavaScript获取当前url路径
1.假设当前页完整地址是:http://localhost:61768/Home/Index?id=2 //获取当前窗口的Url var url = window.location.href; //结 ...
- 用clipboard.js实现纯JS复制文本到剪切板
以前很多人都是用ZeroClipboard.js来实现网页复制内容,火端也是用它.ZeroClipboard是利用flash来实现的,ZeroClipboard兼容性很好,但是由于现在越来越多的浏览器 ...
- PHP面向对象编程基本原则
首先祝大家节日快乐!!! 额,不知道你们剁手没,小梦是没有!整整已经错过了第九个年头! 小伙伴是不是有一种感觉,PHP入门的时候简直爱不释手,总是把 "PHP是世界上最好的语言" ...
- C语言实现整数和16进制互相转换
编译环境:Dev-C++ 5.2.0.3 使用sprintf()函数实现转换,代码如下: #include <stdio.h> #include <stdlib.h> int ...
- Machine Learning - week 1
Matrix 定义及基本运算 Transposing To "transpose" a matrix, swap the rows and columns. We put a &q ...
- 浴室沉思:聊聊DAL和Repository
这是一个由DDD群引发的随笔 在写了上一篇随笔<关于ORM的浴室沉思>后一些朋友私聊我,很多刚接触DDD的朋友会对Repository(仓储层)这东西有点疑惑,为什么要叫仓储层?是不是三层 ...
- python学习之总结
迭代器: def gen(): a = 100 yield a a = a * 8 yield a yield 1000 for i in gen(): print(i) 创建一个函数,循环体,yie ...
- 常用Windows DOS命令项目部署经常用到
img { max-width: 100% } 前两天部署.netcore项目,首先是生产环境域名访问不了,再到.netcore项目IIS部署502.5,在到莫名其妙的500,在排查项目部署问题的时候 ...
- 浅谈event.client、event.screen与event.offset
每每看到event.client.event.screen与event.offset这几个,头都大了,今天又碰到了,特来总结下. 1.event.screenX与event.screenY. 首先,e ...
- 从#65279字符看dede模板页面编码问题
今天一位朋友让帮忙给解决一个dede模板的问题,问题主要是:模板文件生成html文件之后会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白行. 接到"& ...