为了账号安全,请及时绑定邮箱和手机立即绑定
建议看完源码再来看这一节,要不会很头疼的
通俗易懂的理解啊, 不错 !!!引用一下 !!理解:1.$(),jQuery()是执行一个函数,$和jQuery是函数名称,这个函数返回的是一个对象,所以里面是一个new表达式,但是名字不能是自己,否则无限循环。2.既然不是自己,其实可以理解为jQuery()返回的不是jQuery对象,而是jQuery.fn.init(一个名字而已)对象。3.但是为了统一和方法/属性的共用(理解原型链),jQUuery这样处理,jQuery.fn.init.prototype = jQuery.prototype.
学到后面就没人了,太浮躁
第三条真是看得云里雾里,隔了两天再看现在仍是一脸懵逼
js中的同步: 后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。 异步:,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
这两个案例都实现了异步,但不同的是,案例一比较难看懂,而且代码耦合度较高。 案例二则相对来说清晰很多。
先推荐看一看这篇博客:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
异步就是解决这种呆板,让b进入阻塞状态,挂起b,继续运行c 和 d,当a 产生了交互结果,再运行b。
同步的代码段运行顺序: a - b -c -d
异步的代码段运行顺序: a - c -d -b 或者 a - c -b -d
我的理解:所谓阻塞,就是b代码段依赖于a代码段的结果,假如a代码段未返回结果,那么b代码段就会一直等待。
我们知道js是单线程的,也就是说,同一时刻,只能运行一段代码,假设我们自上而下有a b c d四个代码段,a代码运行时需要与服务器端交互,而b代码则依赖于a的交互结果,当a运行完成后,自上而下就需要运行b代码了,可是因为b需要a与服务器的交互结果,而与服务器进行交互相对来说又很慢,所以我们只能让b阻塞,然后等待知道交互结果产生再运行b,然后运行c d。可是c代码和d代码根本就不需要依赖于a的结果,我们阻塞了b的话,c 和 d 也一直在等待,这样是不是有些太呆板了?异步就是解决这种呆板...
jQuery中每一个对象都是一个新的jQuery.fn.init()实例,所以即使两个jQuery中包含的DOM元素相同,这两个jQuery对象也并无关系。
好了,那么静态方法就是给jQuery对象附加一个uid,而实例方法则就是给jQuery对象中的DOM节点上附加uid。这就是为啥静态方法不覆盖而实例方法覆盖的原因了
看到这里,我思考了很久,终于搞懂了以前一直疑惑的地方。
直接看代码:
代码一:
var a1 = document.getElementById('#ha');
var a2 = document.getElemnetById('#ha');
console.log(a1 ==a2) // true
代码二:
var a1 = $('#ha');
var a2 = $('#ha');
console.log(a1 == a2) // false
不同的结果,我以前一直以js的思想思考jQuery。jQuery中每一个对象都是一个新的 。。。。
接上: 比如说我们有一个缓存池的expando属性的值为20161124.1825 ,在这个缓存池中 只有 一个名为 a 的DOM元素,那么就会为a附加一个属性20161124.1825 ,也就是a.20161124.1825 = 1 (为什么不是0呢?看上面的代码this.cache[0]是一个函数,返回某个对象且不能修改)。
当我们要操作a的缓存对象时,我们需要找到a的20161124.1825 = 1属性,根据这个属性找到expando为20161124.1825的缓存池,然后找到缓存池中的cache[1],对其进行操作。
个人理解(可能有错误啊,请高手指点):Data()构造函数本身所要构造的就是缓存池对象,因为可能有多个缓存池,所以,为了给每个缓存池一个独一无二的id,就用了这段代码:this.expando = jQuery.expando + Math.random();每一个缓存池对象都有expando属性,这个属性保存了其自身的id,而且这个id值几乎不可能与其他缓存池的expando属性值相同。
然后每个缓存池可能有多个DOM元素映射对象,凡事从属于这个缓存池的DOM元素都存在一个 与这个缓存池的expando属性的值相同的属性,这个属性保存了自身的映射对象在缓存池中对应的key。 字数限制另起评论
不知道我的理解对不对:
1 DOM元素
cache = {id1:{ },id2:{ }......}
DOM.cache_id = some_number // 数据类型是数字
当我们要操作DOM的缓存数据时,我们需要访问他的cache_id属性,这个属性的值是数字类型,取到值以后,使用cache[some_number]就得到了该DOM的缓存数据对象。 DOM的cache_id属性只是保存了映射关系,并没有绑定额外的js对象。
2 js对象
缓存数据对象直接存储在该js对象的某个属性中。操作这个js对象的属性就是操作这个js的缓存数据对象。
在开发中,我们可能会为DOM节点自定义添加很多属性,如果给DOM元素添加自定义的属性和过多的数据可能会引起内存泄漏,所以要尽量避免这么干。(在js中内存泄漏的大多情况都是由于DOM节点与js对象循环引用引起的) ,为了在给DOM附加额外属性的同时不引起内存泄漏,引入了数据缓存系统。
数据缓存接口有两个:$.data() .data()
恭喜你,通过了本次课程 返回课程
课程须知
源码的阅读不是一蹴而就的,需要大家有一定的功底,比如jQuery的基础运用以及API的熟悉度,除此之外要有牢固的javascript、DOM、CSS的基础功底,甚至还需要理解常见的设计模式、数据结构等等。当然大家也不要被这些给吓住了,理解,总是需要一种慢慢的学习过程。
老师告诉你能学到什么?
通过本课程的学习,您可以由浅入深地剖析jQuery库的设计与实现。 其中我们围绕的重心: 1、设计理念 2、结构组织 3、接口设计 4、模式运用 5、场景套用

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

举报

0/150
提交
取消