jquery源码解析
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于jquery源码解析内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在jquery源码解析相关知识领域提供全面立体的资料补充。同时还包含 j2ee是什么、jar格式、java 的知识内容,欢迎查阅!
jquery源码解析相关知识
-
jQuery源码解析系列之$.extend 函数及用法详解最近在学习jQuery源码(v2.0.3),故在此跟大家一起分享下学习的经验和一些小小技巧,jQuery的扩展方法extend是我们经常在写插件的时候常用的方法,extend方法有两种,一种是$.extend(),另外一种是$.fn.extend()。两种方法有少许差异,再次,我们一起去学习了解。 jQuery的扩展方法原型 extend(dest, src1, src2, src3...) extend的含义是讲src1,src2,src3...合并到dest中,返回值为合并后的dest,从上面可以看出使用了extend方法后,会修改dest的结构,同时也可以将空对象{}作为参数传入
-
jQuery源码浅析一导语:如何提高编程能力,这几乎是媒体们采访一些编程大神的必问的问题,大部分大神都会提到多读源码,本人觉得确实有道理,因为源码中的一些方法或者思想确实能够让我们跳出自己的思维模式,拓展我们的编程思维。下面我们就来浅析jQuery源码部分知识。jQuery源码差不多有上万行代码了,下面是其各部分的架构(在博客园上拷贝的一张图):Paste_Image.png**(一)、总体框架 **首先我们来总体看下jquery的代码:(function(window, undefined) { // jQuery 代码})(window);通过上面我们很容易看到jQuery的实现方法都被包含在立即执行函数中了,这样我们在引用jQuery时就马上执行了,并且jQuery里面的变量不会污染外界的变量。(对于单独暴露出的$及jQuery这两个参数其也做了防冲突处理这个我们在下一点将会谈到)。其中我们还看到在这个立即执行函数中在外界传了一个“wi
-
【深入浅出jQuery】源码浅析--整体架构最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美。其结构明晰,高内聚、低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷、渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹。另外,阅读源码让我接触到了大量底层的知识。对原生JS 、框架设计、代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章。我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下。jQuery v1.10.2 源码注解 。系列第二篇:【深入浅出jQuery】源码浅析2--奇技淫巧 网上已经有很多解读 jQuery 源码的文章了,作为系列开篇的第一篇,思前想去起了个【深入浅出jQuery】的标题,资历尚浅,无法对 jQuery 分析的头头是道,但是 jQuery 源码当中确实有着大量巧妙的设计,不同层次水平的阅读者都能有收获,所以打算厚着脸皮将自己从中学到的一些知识点共享出来。打
-
【深入浅出jQuery】源码浅析2--奇技淫巧最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美。其结构明晰,高内聚、低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷、渐进增强)优雅的处理能力以及 Ajax 等方面周到而强大的定制功能无不令人惊叹。另外,阅读源码让我接触到了大量底层的知识。对原生JS 、框架设计、代码优化有了全新的认识,接下来将会写一系列关于 jQuery 解析的文章。我在 github 上关于 jQuery 源码的全文注解,感兴趣的可以围观一下。jQuery v1.10.2 源码注解 。 系列第一篇:【深入浅出jQuery】源码浅析--整体架构本篇是系列第二篇,标题起得有点大,希望内容对得起这个标题,这篇文章主要总结一下在 jQuery 中一些十分讨巧的 coding 方式,将会由浅及深,可能会有一些基础,但是我希望全面一点,对看文章的人都有所帮助,源码我还一直在阅读,也会不断的更新本文。即便你不想去阅读源码,看看下面的总结,我想对提高编程能
jquery源码解析相关课程
jquery源码解析相关教程
- jQuery jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the way that millions of people write JavaScript.(jQuery 官方介绍)
- 6. Sequences 原理源码完全解析 //使用序列fun main(args: Array<String>){ (0..100) .asSequence() .map { it + 1 } .filter { it % 2 == 0 } .find { it > 3 }}//使用普通集合fun main(args: Array<String>){ (0..100) .map { it + 1 } .filter { it % 2 == 0 } .find { it > 3 }}通过 decompile 上述例子的源码会发现,普通集合操作会针对每个操作都会生成一个 while 循环,并且每次都会创建新的集合保存中间结果。而使用序列则不会,它们内部会无论进行多少中间操作都是共享同一个迭代器中的数据,想知道共享同一个迭代器中的数据的原理吗?请接着看内部源码实现。6.1 使用集合普通操作反编译源码 public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); byte var1 = 0; Iterable $receiver$iv = (Iterable)(new IntRange(var1, 100)); //创建新的集合存储map后中间结果 Collection destination$iv$iv = (Collection)(new ArrayList(CollectionsKt.collectionSizeOrDefault($receiver$iv, 10))); Iterator var4 = $receiver$iv.iterator(); int it; //对应map操作符生成一个while循环 while(var4.hasNext()) { it = ((IntIterator)var4).nextInt(); Integer var11 = it + 1; //将map变换的元素加入到新集合中 destination$iv$iv.add(var11); } $receiver$iv = (Iterable)((List)destination$iv$iv); //创建新的集合存储filter后中间结果 destination$iv$iv = (Collection)(new ArrayList()); var4 = $receiver$iv.iterator();//拿到map后新集合中的迭代器 //对应filter操作符生成一个while循环 while(var4.hasNext()) { Object element$iv$iv = var4.next(); int it = ((Number)element$iv$iv).intValue(); if (it % 2 == 0) { //将filter过滤的元素加入到新集合中 destination$iv$iv.add(element$iv$iv); } } $receiver$iv = (Iterable)((List)destination$iv$iv); Iterator var13 = $receiver$iv.iterator();//拿到filter后新集合中的迭代器 //对应find操作符生成一个while循环,最后末端操作只需要遍历filter后新集合中的迭代器,取出符合条件数据即可。 while(var13.hasNext()) { Object var14 = var13.next(); it = ((Number)var14).intValue(); if (it > 3) { break; } } }6.2 使用序列 (Sequences) 惰性操作反编译源码1、整个序列操作源码 public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); byte var1 = 0; //利用Sequence扩展函数实现了fitler和map中间操作,最后返回一个Sequence对象。 Sequence var7 = SequencesKt.filter(SequencesKt.map(CollectionsKt.asSequence((Iterable)(new IntRange(var1, 100))), (Function1)null.INSTANCE), (Function1)null.INSTANCE); //取出经过中间操作产生的序列中的迭代器,可以发现进行map、filter中间操作共享了同一个迭代器中数据,每次操作都会产生新的迭代器对象,但是数据是和原来传入迭代器中数据共享,最后进行末端操作的时候只需要遍历这个迭代器中符合条件元素即可。 Iterator var3 = var7.iterator(); //对应find操作符生成一个while循环,最后末端操作只需要遍历filter后新集合中的迭代器,取出符合条件数据即可。 while(var3.hasNext()) { Object var4 = var3.next(); int it = ((Number)var4).intValue(); if (it > 3) { break; } } }2、抽出其中这段关键 code,继续深入:SequencesKt.filter(SequencesKt.map(CollectionsKt.asSequence((Iterable)(new IntRange(var1, 100))), (Function1)null.INSTANCE), (Function1)null.INSTANCE);3、把这段代码转化分解成三个部分://第一部分val collectionSequence = CollectionsKt.asSequence((Iterable)(new IntRange(var1, 100)))//第二部分val mapSequence = SequencesKt.map(collectionSequence, (Function1)null.INSTANCE)//第三部分val filterSequence = SequencesKt.filter(mapSequence, (Function1)null.INSTANCE)4、解释第一部分代码:第一部分反编译的源码很简单,主要是调用 Iterable 中扩展函数将原始数据集转换成 Sequence 对象。public fun <T> Iterable<T>.asSequence(): Sequence<T> { return Sequence { this.iterator() }//传入外部Iterable<T>中的迭代器对象}更深入一层:@kotlin.internal.InlineOnlypublic inline fun <T> Sequence(crossinline iterator: () -> Iterator<T>): Sequence<T> = object : Sequence<T> { override fun iterator(): Iterator<T> = iterator()}通过外部传入的集合中的迭代器方法返回迭代器对象,通过一个对象表达式实例化一个 Sequence,Sequence 是一个接口,内部有个 iterator () 抽象函数返回一个迭代器对象,然后把传入迭代器对象作为 Sequence 内部的迭代器,也就是相当于给迭代器加了 Sequence 序列的外壳,核心迭代器还是由外部传入的迭代器对象,有点偷梁换柱的概念。5、解释第二部分的代码:通过第一部分,成功将普通集合转换成序列 Sequence,然后现在进行 map 操作,实际上调用了 Sequence 扩展函数 map 来实现的val mapSequence = SequencesKt.map(collectionSequence, (Function1)null.INSTANCE)进入 map 扩展函数:public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R> { return TransformingSequence(this, transform)}会发现内部会返回一个 TransformingSequence 对象,该对象构造器接收一个 Sequence 类型对象,和一个 transform 的 lambda 表达式,最后返回一个 Sequence 类型对象。我们先暂时解析到这,后面会更加介绍。6、解释第三部分的代码:通过第二部分,进行 map 操作后,然后返回的还是 Sequence 对象,最后再把这个对象进行 filter 操作,filter 也还是 Sequence 的扩展函数,最后返回还是一个 Sequence 对象。val filterSequence = SequencesKt.filter(mapSequence, (Function1)null.INSTANCE)进入 filter 扩展函数:public fun <T> Sequence<T>.filter(predicate: (T) -> Boolean): Sequence<T> { return FilteringSequence(this, true, predicate)}会发现内部会返回一个 FilteringSequence 对象,该对象构造器接收一个 Sequence 类型对象,和一个 predicate 的 lambda 表达式,最后返回一个 Sequence 类型对象。我们先暂时解析到这,后面会更加介绍。7、Sequences 源码整体结构介绍代码结构图 :图中标注的都是一个个对应各个操作符类,它们都实现 Sequence 接口首先,Sequence 是一个接口,里面只有一个抽象函数,一个返回迭代器对象的函数,可以把它当做一个迭代器对象外壳。public interface Sequence<out T> { /** * Returns an [Iterator] that returns the values from the sequence. * * Throws an exception if the sequence is constrained to be iterated once and `iterator` is invoked the second time. */ public operator fun iterator(): Iterator<T>}Sequence 核心类 UML 类图这里只画出了某几个常用操作符的类图注意:通过上面的 UML 类关系图可以得到,共享同一个迭代器中的数据的原理实际上就是利用 Java 设计模式中的状态模式 (面向对象的多态原理) 来实现的,首先通过 Iterable 的 iterator () 返回的迭代器对象去实例化 Sequence,然后外部调用不同的操作符,这些操作符对应着相应的扩展函数,扩展函数内部针对每个不同操作返回实现 Sequence 接口的子类对象,而这些子类又根据不同操作的实现,更改了接口中 iterator () 抽象函数迭代器的实现,返回一个新的迭代器对象,但是迭代的数据则来源于原始迭代器中。8、接着上面 TransformingSequence、FilteringSequence 继续解析.通过以上对 Sequences 整体结构深入分析,那么接着 TransformingSequence、FilteringSequence 继续解析就非常简单了。我们就以 TransformingSequence 为例://实现了Sequence<R>接口,重写了iterator()方法,重写迭代器的实现internal class TransformingSequence<T, R>constructor(private val sequence: Sequence<T>, private val transformer: (T) -> R) : Sequence<R> { override fun iterator(): Iterator<R> = object : Iterator<R> {//根据传入的迭代器对象中的数据,加以操作变换后,构造出一个新的迭代器对象。 val iterator = sequence.iterator()//取得传入Sequence中的迭代器对象 override fun next(): R { return transformer(iterator.next())//将原来的迭代器中数据元素做了transformer转化传入,共享同一个迭代器中的数据。 } override fun hasNext(): Boolean { return iterator.hasNext() } } internal fun <E> flatten(iterator: (R) -> Iterator<E>): Sequence<E> { return FlatteningSequence<T, R, E>(sequence, transformer, iterator) }}9、源码分析总结序列内部的实现原理是采用状态设计模式,根据不同的操作符的扩展函数,实例化对应的 Sequence 子类对象,每个子类对象重写了 Sequence 接口中的 iterator () 抽象方法,内部实现根据传入的迭代器对象中的数据元素,加以变换、过滤、合并等操作,返回一个新的迭代器对象。这就能解释为什么序列中工作原理是逐个元素执行不同的操作,而不是像普通集合所有元素先执行 A 操作,再所有元素执行 B 操作。这是因为序列内部始终维护着一个迭代器,当一个元素被迭代的时候,就需要依次执行 A,B,C 各个操作后,如果此时没有末端操作,那么值将会存储在 C 的迭代器中,依次执行,等待原始集合中共享的数据被迭代完毕,或者不满足某些条件终止迭代,最后取出 C 迭代器中的数据即可。
- 1.jQuery Ajax 这个技术在前面章节有独立章节进行讲解。事实上,$.ajax 是基于原生 XMLHttpRequest 进行了封装,并且提供了一套高度统一的设计和编程接口。在我们的代码中,我们一般都这样写:$.ajax({ method: 'POST', url: url, data: data, success: function () {}, error: function () {}});或者结合 deferred 的写法:$.ajax({ url: url, method: 'GET', data : data}).done(data => { // code}).fail(err => { // code})不吹不黑,jQuery 提供的这一套 Ajax 工具方法真的非常优秀,并且经历了这么多年的打磨,其稳定性、成熟度自然不必多言。关于 jQuery 的 Ajax 工具方法的优点,在前面章节已经讲过。至少从使用体验上来讲,简单易用,功能齐全,以至于我身边至今依然有很多开发者在使用这一套工具函数。然而,随着技术的发展,jQuery 也逐步走向一个衰弱的过程。越来越多的前端开发者开始使用诸如 Angular、React 和 Vue 这样的新型框架。想像一下,如果我们在一个基本用不到 jQuery 的技术中进行前端开发,为了要使用 jQuery 的 Ajax 相关方法而强行引入整个 jQuery,这显然是不现实也不可取的。在更新的技术中,我们将寻求体积更小,更为先进的类库。
- 2. Scrapy 常用命令源码分析 这一部分内容我们将分析上面介绍的命令的执行过程,从源码角度来审视这些命令行操作过程。
- 2.1 找到代码块源码 点击菜单栏-工具-代码块设置-vue代码块,可以看到下面这两段关于条件编译的代码块源码。实例:"#ifdef": { "body": [ "<!-- #ifdef ${1:APP-PLUS/APP-VUE/APP-NVUE/MP/MP-ALIPAY/MP-BAIDU/MP-WEIXIN/MP-QQ/MP-TOUTIAO/MP-360/H5/QUICKAPP-WEBVIEW-HUAWEI/QUICKAPP-WEBVIEW-UNION/QUICKAPP-WEBVIEW} -->", "$0", "<!-- #endif -->" ], "prefix": "ifdef", "project": "uni-app", "scope": "source.vue.html" }, "#ifndef": { "body": [ "<!-- #ifndef ${1:APP-PLUS/APP-VUE/APP-NVUE/MP/MP-ALIPAY/MP-BAIDU/MP-WEIXIN/MP-QQ/MP-TOUTIAO/MP-360/H5/QUICKAPP-WEBVIEW-HUAWEI/QUICKAPP-WEBVIEW-UNION/QUICKAPP-WEBVIEW} -->", "$0", "<!-- #endif -->" ], "prefix": "ifndef", "project": "uni-app", "scope": "source.vue.html" },2.2 代码块源码解析我能上面贴出的代码块,包括两个条件编译的代码块,分别是 ifdef、ifndef。每个代码块都几个配置项,这两个代码块包含的配置项分别是 “body”、“prefix”、“project”、“scope”,当然还有一些其他的配置项,下面我们来通过这些配置项了解一下代码块源码。
- 2. Scrapy-Redis 源码分析 我们从 github 上可以找到 scrapy-redis 插件的源码。它的代码少而精,但是简单的扩展就能使得 scrapy 框架具备分布式功能,因此它在 github 上也收获了不少赞。我们下载其源码来一窥其内部原理:scrapy-redis插件源码一览我们会从一开始继承的 RedisSpider 类开始学起,并逐步深入源码学习。
jquery源码解析相关搜索
-
j2ee
j2ee是什么
jar格式
java
java api
java applet
java c
java jdk
java list
java map
java script
java se
java socket
java swing
java switch
java web
java xml
java 程序设计
java 多线程
java 环境变量