研究源码可以提高对框架的认识,写出性能上更友好、更具语义化的代码。jQuery不管是否过时了,喜欢就看,不喜欢就把网页关掉,不必去争论过时与否的问题。
平时我们$dom.on和$dom.data存储的数据和回调函数都去哪了?
events:
解开一个click:
推测namespace是event的命名空间:
dom是怎么和$.cache发生关系的?
把值直接套入:
它们之间的联系如下:
证明储物柜存储内容如图中所描述的:
1、data属性存储的是$dom.data(name, value)存储 的内容:
2、events存储的就是事件相关的数据:
//查看初始数据
//自定义一个事件到body上,然后查看数据:
动态添加的句柄是会放在JS的虚拟机中
3、handle是什么鬼
//命令行调试直接定位:
//内部的dispatch应该是派发事件,即触发事件句柄
//通过拿到储物柜,然后再拿对应的事件句柄:
遍历,拿出来处理再存储:
在下一处循环进行拆解,通过apply调用
jq的事件回调里面如果return false;的话,可以阻止事件冒泡,这也是上图中,为什么要在循环的底部做下图的处理:
handle最后还是批量触发某一种时间类型的回调。
=======================================================
1、$.cache就是整个jquery的数据存储仓库,
2、cache也是变相的挂载在window上,当我们缓存的越多,内出占用就越大,所以不要轻易去存储数据
3、尽管jquery有做优化,毕竟瘦死的骆驼比马大。
4、存储数据的路径,层级比较复杂,data的数据通过obj.attr属性读取,events这是通过obj.attr拿到事件句柄集合,然后通过循环调用特定的句柄,通过apply去触发,所以读取的过程也是一份开销:
obj.attr相对数组、局部变量来说,读取的速度是最慢的。
像我们在mousemove,scroll,mousewheel这类高频事件上,就不推荐在里面读写cache上面的数据,可以看下$dom.data和$dom.on这两个接口,内部比较复杂,运算较多。
但事件交互的过程中有时候需要缓存一些状态、数据判断程序的下一步如何运行,这一类的需求一般可以通过外部作用域的局部变量或者对象去做通信