起因

随着饿百新零售项目一期的告一段落,算是暂时从加班的修罗场里面解放出来了,于是就想搞点事情,正好看项目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. CSS基础知识(display和visibility、overflow、文档流)

    9.显示与隐藏 u  display属性: (1)none:隐藏元素,不会再占有页面的任何空间,即不会影响布局. (2)inline:默认值.将元素[显示]为内联元素     (与HTML元素本身无关 ...

  2. [51nod1709]复杂度分析

    给出一棵n个点的树(以1号点为根),定义dep[i]为点i到根路径上点的个数.众所周知,树上最近公共祖先问题可以用倍增算法解决.现在我们需要算出这个算法精确的复杂度.我们定义计算点i和点j最近公共组先 ...

  3. Video Target Tracking Based on Online Learning—TLD多目标跟踪算法

    TLD算法回顾 TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek Kalal在其攻读博士学位期间提出的一种新的单目标长时间(long ter ...

  4. centos7+cdh5.10.0搭建

    一.选择环境: 1.说明 本次部署使用台机器,3台用于搭建CDH集群,1台为内部源.内部源机器是可以连接公网的,可以提前部署好内部源,本次部署涉及到的服务器的hosts配置如下: 192.168.10 ...

  5. Linux下C++/C的编译调试

    这几天因为任务的原因我需要在ubuntu下编写程序.因此恶补了许多linux程序编写的知识.我分以下几个方面总结我所学的知识. gcc,g++,make命令的使用 gdb 调试 VScode的使用 c ...

  6. 启动tomcat时,一直卡在Deploying web application directory这块的解决方案

    本来今天正常往服务器上扔一个tomcat 部署一个项目的, 最后再启动tomcat 的时候 发现项目一直都访问不了,看了一下日志: [root@iz8vbdzx7y7owm488t4d89z bin] ...

  7. dedecsm系统(企业简介)类单栏目模版如何修改和调用整理

    作者:佚名 字体:[增加 减小] 来源:互联网 时间:01-15 17:33:07 我要评论 我们的模版里应该都有article_article.htm这个模版;article_article.htm ...

  8. MapReduce 原理与 Python 实践

    MapReduce 原理与 Python 实践 1. MapReduce 原理 以下是个人在MongoDB和Redis实际应用中总结的Map-Reduce的理解 Hadoop 的 MapReduce ...

  9. jQuery操作表格(table)的常用方法、技巧汇总

    摘录自:http://www.jb51.net/article/48943.htm 虽然现在DIV+CSS进行页的布局大行其道,但是很多地方使用table还是有很多优势,用table展示数据是比较方便 ...

  10. 如何安装 Composer

    下载 Composer 安装前请务必确保已经正确安装了 PHP.打开命令行窗口并执行 php -v 查看是否正确输出版本号. 打开命令行并依次执行下列命令安装最新版本的 Composer: php - ...