jQuery源码阅读 - 整体结构分析

一个优秀的工具库并不是并不是找个对象将一些变量、方法封装到里面就可以的,还要对实际应用过程中可能遇到的问题留下解决预案,比如说:将来需要扩展更多功能怎么办?暴露的$字符和其他库冲突了怎么办?…

注意:
jQuery不是一朝一夕能学习完的,相关的blog也是会持续发布,如果想系统地查看Query源码阅读相关blog,可以选择前往jQuery源码阅读 - 入口文件

开始

(function(global, factory){
    if(typeof module === 'object' && typeof module.exports === 'object'){
        // 支持CommonJS模块规范的执行这里(Node......)
        // 不管它!!
    }else{
        // 可以理解为是浏览器或者(Web-View)环境
        // global === window
        // factory === function(window, noGlobal)
        factory(global)
    }
// 浏览器下一定有window
})(typeof window !=="undefined"?window : this, function(window, noGlobal){

// jQuery 中的方法、属性

})

分析:
自执行函数,借用函数作用域的隔离,防止变量冲突

(function(global, factory){

})(window, function(window, noGlobal){})

这种写法很有意思,利用自执行函数的参数传递的过程,将整个代码分成了两部分。

  1. 条件判断。是否在浏览器中调用jQuery
  2. jQuery中的方法的具体实现
    如果是我来写的话大概就是团成一坨放在自执行函数里面,jQuery的这种写法…可以称之为优雅地装逼

回调函数中的window形参名,作为一个参数名与其它变量名一样,一般情况下并不太妥当,但是形参window在默认情况下就是指向全局window变量,那这种写法就很好了。

注意:接下来的代码都是存在于回调函数中的

noGlobal变量作用:

只出现了两次一是回调函数作为参数传递,一是回调函数末尾
在这里插入图片描述
回调函数虽然有这个参数,但是在调用的时候,根本没有理它。直接就通过factory(global) 调用了。
当然,这个变量在具备CommonJS条件的时候是用得到的。

所以,noGlobal的主要作用就是:在浏览器环境中运行的时候向外暴露两个接口:window.jQuerywindow.$

注意:这里的jQuery暂时理解为一个对象

jQuery是如何解决接口冲突的:

浏览器中的暴露接口其实就是在浏览器的window对象下添加全局属性,这个全局属性承载了库的所有内容。

当两个库同时引入的时候,两个库暴露的接口名可能会冲突。为了防止jQuery库内部的变量和window下的全局变量产生冲突,jQuery使用了自执行函数;为了解决全局下暴露接口与其它库冲突,jQuery实现了noConflict方法。

noConflict方法作用:放弃对$字符的控制权

var

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,
	// Map over the $ in case of overwrite
	_$ = window.$;

jQuery.noConflict = function( deep ) {
	if ( window.$ === jQuery ) {
		window.$ = _$;
	}

	if ( deep && window.jQuery === jQuery ) {
		window.jQuery = _jQuery;
	}

	return jQuery;
};

分析:
如果同时引入两种库:base.jsjquery.js,并且是先引入的base.js

<script src="base.js"></script>
<script src="jQuery.js"></script>

那么此时如果jQuery的接口发生冲突,可以调用noConflict方法。

在引入jQuery.js的时候,会按照代码顺序执行。当执行到定义_jQuery变量_$变量的时候,还没有经过对noGlobal变量的判断暴露jQuery的接口。所以此时$_jQuery指向的是base.js中暴露的接口。当jQuery初始代码完整执行后,接口$jQuery会指向jQuery库中的jQuery变量,这样会导致base.js没有接口可以调用。

在使用base.js之前调用noConflict方法,jQuery会将接口的控制权移交。如果deep没有设置, window.$重新指向之前保存的base.js的接口,移交$的控制权;如果deep设置了,将jQuery的控制权也放弃。

问:如何为jQuery设置新的接口?

答:noConflict方法会返回jQuery对象,接收之后可以自行设置。

let test = $.noConflict(true);
window.test = test;

jQuery变量究竟是什么?

代码:(line: 145)

var
	version = "3.4.1",
	jQuery = function( selector, context ) {
		return new jQuery.fn.init( selector, context );
	},
	
    // jQuery是一个类(类才有prototype) 
    // jQuery.fn是给原型设置的一个别名
    jQuery.fn = jQuery.prototype = {
        // 公共的属性和方法
        jquery: version,
        constructor: jQuery,
        	// The default length of a jQuery object is 0
        length: 0,
    }

jQuery其实就是一个函数,接收selector(选择器)和context(很多人不知道这个)变量。返回值是一个类的实例!!其实就是我们经常使用$('div')这样子,返回一个jQuery实例对象。

注意:非构造函数jQuery.fn.init也可以通过new操作符创建实例

jQuery.fn.init来源:(line: 2936)

init = jQuery.fn.init = function (selector, context, root){
    // 对选择器对象的生成
    // ......
    // 创建一个类数组
		return jQuery.makeArray( selector, this );
}

解读一:init存在的理由

有没有觉得init是个多余的?jQuery接收的参数全部都传递给init了,直接在jQuery中实现不好么
问题:为什么要通过init来创建实例?直接使用jQuery创建不好么
答案:一个类的实例的创建需要new操作符,想要像$("div")这样,不需要new操作符就能创建实例,就需要一个中间类来进行转化。
jQuery.fn.init存在作用:作为一个中间类,省略jQuery创建实例时的new操作符;

解读二:jQuery两种调用方法的方式

jQuery()是一个函数,对应我们平时常用的$('div')
jQuery也是一个对象,对应我们平时用到的$.noConflict()

jQuery给我们提供的方法放到了两个位置上

  1. jQuery原型上:jQuery.fn = jQuery.prototype = {}
    1. $().toArray():只有jQuery实例才能调用
  2. jQuery对象上:jQuery.extend({ajax: function(url, options){}})
    1. 直接通过$调用 $.ajax()
      jQuery实例其实是一个类数组(jQuery对象)基于makeArray创建出来

jQuery是如何扩展的?

extend: 向jQuery中继续扩展方法

$.extend({}); //=> 扩展到JQ对象上:一般是为了完善类库,提供更多的工具方法
$.extend(true, {});
$.fn.extend(); // => 扩展到JQ原型上: 一般是为了写JQ插件,让JQ的实例来调用
$().extend()
jQuery.extend = jQuery.fn.extend = function () {

}
// 默认情况如果自行扩展的函数名与jQuery中原来有的冲突,那么以jQuery的为主
 $.extend({
    queryURLParams: function(){
        
    }
})
// 如果想要以自己扩展的为主:添加参数:true
$.extend(true, {
    ... 
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
书名:jQuery权威指南(系统介绍jQuery方方面面,囊括118个实例和2个综合案例,实战性强) 作者:陶国荣 著 书号:978-7-111-32543-7 定价:59.00元 出版社:机械工业出版社华章公司 出版时间:2011年1月 编辑推荐: 内容全面,系统地讲解了jQuery方方面面 实战性强,囊括118个实例和2个综合案例 资深专家亲自执笔,4大专业社区一致鼎力推荐 内容简介: jQuery是继Prototype之后的又一个优秀JavaScript框架,深受全球开发者欢迎,已经成为Web开发领域的事实标准。jQuery以其轻巧的体积、强大的选择器、出色的DOM封装、丰富的插件支持使得广大的Web前端开发者得心应手,极大地提高了他们的开发效率;此外,jQuery中完善的Ajax功能、行为与结构层的分离、可靠的事件处理机制也同样使得Web后端开发者如虎添翼,使用少量代码就可以实现复杂的功能。特别是新版本1.4.x的发布,jQuery在功能和性能方面都有质的提升,极大地满足了广大开发者提出的更高要求。因此,为了提高Web开发的效率和强化Web应用的功能,熟练使用jQuery是Web开发者必备的一种能力。 《jQuery权威指南》由国内资深Web技术专家亲自执笔,4大Web开发社区一致鼎力推荐,权威性毋庸置疑。 内容新颖,基于jQuery的最新版本撰写,所有新功能和新特性一览无余;内容全面,不仅讲解了jQuery技术本身的方方面面,而且还包括与jQuery相关的扩展知识;实战性强,不仅每个知识点都配有完整的小案例,而且还有两个综合性的案例。本书不仅能满足读者系统学习理论知识的需求,还能满足需要充分实践的需求。 全书一共分为11章,首先以示例的方式对jQuery做了全局性的介绍,以便于为读者建立jQuery的大局观,这对初学者尤为重要;其次详细讲解了jQuery的各种选择器、jQuery操作DOM的方法、jQuery中的事件与应用、jQuery中的动画和特效、Ajax在jQuery中的应用,以及各种常用的jQuery插件的使用方法和技巧,所有这些知识点都配有完整的示例(包括需求分析、代码实现和结果展示三部分);再接着对jQuery UI和jQuery实用工具函数等扩展知识,以及jQuery的开发技巧与性能优化等方面的重要知识做了详尽的阐述;最后以两个具有代表性的综合案例结束全书,希望能帮助读者将前面所学的理论知识真正贯穿于实践中,迅速进入jQuery的殿堂。 作者简介: 陶国荣,资深Web技术专家,有10余年开发经验,是国内较早专业从事Web开发的一线技术人员和培训讲师。醉心于对JavaScript、jQuery和Ajax等Web开发技术的研究与实践,并长期专注于HTML页面的优化与用户体验的研究,在页面框架搭建、数据流向分析、页面静态优化方面拥有丰富的实践经验。此外,他还是微软技术方面的专家,精通C#、ASP.NET 和SQL Server等技术,出版相关著作多部。 媒体推荐: jQuery的发展之迅速和取得的成功之巨大是其他所有开发框架都难以企及的,它已经成为Web开发者必备的核心技能之一。如果你尚未掌握jQuery或功力还不够,推荐你认真阅读这本书并付诸实践,与同类的jQuery图书相比,它有3大优势:内容非常全面,几乎包含jQuery的所有内容;基于jQuery的最新版本撰写,所有新功能特性一览无余;实战性极强,不仅有118个小型案例,而且还有两个综合案例。——jQuery中文社区 jQuery因为使用简单、功能强大、插件丰富而深受Web开发者青睐。《jQuery权威指南》不仅完整地呈现了jQuery本身所有的功能,而且讲解了jQuery UI等扩展功能;更值得一提的是,还包括最佳实践和性能优化方面的技巧,内容全面,结构合理。除此之外,本书还包括大量的实例,不仅每个知识点都配有小例子,而且还有两个综合性的案例。对于初学者而言,本书应该是学习jQuery的首选。——jQuery中文用户组 jQuery因为易于使用和功能强大著称,是所有Web开发者应该掌握的一种利器,初学者如何才能快速而有效地掌握jQuery呢?最好的方法莫过于一边学习理论,一边动手实践这些理论,本书就是按照这种思路为读者打造的,强烈推荐。——JavaScript开发者社区 jQuery从众多的Ajax框架中脱颖而出,已经成为Web开发领域的事实标准。《jQuery权威指南》除了理论知识丰富而全面外,它还有一个最大的特点就是注重实战,每个知识点都有一个完整的案例,包括需求分析、代码实现和结果展示三个部分,而且还包含两个综合性的案例,它的实践性之强是目前所有同类书都不具备的,恰好这一点又是初学者最需要的。如果能阅读本书并付诸实践,进入jQu
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值