通俗易懂的理解啊, 不错 !!!引用一下 !!理解:1.$(),jQuery()是执行一个函数,$和jQuery是函数名称,这个函数返回的是一个对象,所以里面是一个new表达式,但是名字不能是自己,否则无限循环。2.既然不是自己,其实可以理解为jQuery()返回的不是jQuery对象,而是jQuery.fn.init(一个名字而已)对象。3.但是为了统一和方法/属性的共用(理解原型链),jQUuery这样处理,jQuery.fn.init.prototype = jQuery.prototype.
js中的同步: 后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。 异步:,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
2016-11-25
这两个案例都实现了异步,但不同的是,案例一比较难看懂,而且代码耦合度较高。 案例二则相对来说清晰很多。
先推荐看一看这篇博客:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
先推荐看一看这篇博客:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
2016-11-25
我的理解:所谓阻塞,就是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 也一直在等待,这样是不是有些太呆板了?异步就是解决这种呆板...
我们知道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。这就是为啥静态方法不覆盖而实例方法覆盖的原因了
好了,那么静态方法就是给jQuery对象附加一个uid,而实例方法则就是给jQuery对象中的DOM节点上附加uid。这就是为啥静态方法不覆盖而实例方法覆盖的原因了
2016-11-25
看到这里,我思考了很久,终于搞懂了以前一直疑惑的地方。
直接看代码:
代码一:
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中每一个对象都是一个新的 。。。。
直接看代码:
代码一:
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中每一个对象都是一个新的 。。。。
2016-11-25
接上: 比如说我们有一个缓存池的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],对其进行操作。
当我们要操作a的缓存对象时,我们需要找到a的20161124.1825 = 1属性,根据这个属性找到expando为20161124.1825的缓存池,然后找到缓存池中的cache[1],对其进行操作。
2016-11-24
个人理解(可能有错误啊,请高手指点):Data()构造函数本身所要构造的就是缓存池对象,因为可能有多个缓存池,所以,为了给每个缓存池一个独一无二的id,就用了这段代码:this.expando = jQuery.expando + Math.random();每一个缓存池对象都有expando属性,这个属性保存了其自身的id,而且这个id值几乎不可能与其他缓存池的expando属性值相同。
然后每个缓存池可能有多个DOM元素映射对象,凡事从属于这个缓存池的DOM元素都存在一个 与这个缓存池的expando属性的值相同的属性,这个属性保存了自身的映射对象在缓存池中对应的key。 字数限制另起评论
然后每个缓存池可能有多个DOM元素映射对象,凡事从属于这个缓存池的DOM元素都存在一个 与这个缓存池的expando属性的值相同的属性,这个属性保存了自身的映射对象在缓存池中对应的key。 字数限制另起评论
2016-11-24
不知道我的理解对不对:
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的缓存数据对象。
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的缓存数据对象。
2016-11-24
在开发中,我们可能会为DOM节点自定义添加很多属性,如果给DOM元素添加自定义的属性和过多的数据可能会引起内存泄漏,所以要尽量避免这么干。(在js中内存泄漏的大多情况都是由于DOM节点与js对象循环引用引起的) ,为了在给DOM附加额外属性的同时不引起内存泄漏,引入了数据缓存系统。
数据缓存接口有两个:$.data() .data()
数据缓存接口有两个:$.data() .data()
2016-11-24