jquery1.43源码分析之核心部分
基于jquery-1.4.3rc1版本的. 正式版据说过几天就发布, 应该差别不大.
这个系列应该有十章, 本来准备写完了一起发的. 但有几章还不知道会拖到什么时候. 现在完成大概五章的内容了.
会陆续放上来.
这个源码分析系列我不想它成为单纯的翻译注释.除了那种一眼就明白的代码, 其它基本都加了注解.
有时候一句代码的分析可能会关联到一个重要的知识点, 我也尽量在能力范围内把它讲清. 看源码前尽可能的多思考一下,假如是我们实现这个方法,会怎么去做. 再对比jquery的实现就更能加深理解. 另外你也可以对jquery的某些代码保持怀疑, 每次版本更新,都会修复很多bug, 可能你现在怀疑的就是其中一个.
这些源码分析里面的错误和缺陷肯定是有的. 写成文档的目的一是为了梳理自己的知识,再就是希望在和大家的讨论中, 能认识和改正自己的错误.
最后面提供了pdf下载.
------------------------------- 分割线-----------------------------------------------
jquery核心
一 构造jquery.
相对于其它库里传统的构造对象方法. jquery提供了一种截然不同的方法. 它选择创造一个全新的奇异世界.
首先所有的jquery代码被一个自动执行的闭包包裹起来, 只在后面暴露$和jQuery这2个变量给外界 尽量避开变量冲突.
顾名思义jQuery.inArray就是判断数组里有没有某个元素.当然这里的数组也包括伪数组.
这个方法虽然实现起来很简单, 关于inArray这个名字在jquery的官方论坛却有颇多争议.
很多人认为它应该返回true或者false, 而不是索引的位置.
john resig只是说暂时还不准备修改这个方法.
有些浏览器还不支持Array.prototype.indexOf方法. 所以首先在源码的851行, 有这样一段代码.
看看源码实现.
首先声明一些特殊的节点, 在它们身上存属性的时候可能会抛出异常.
从新版本的源码里可以看到, 1.42版本中data方法的几个缺点已经被解决了.
当然我们用jquery缓存系统的时候, 一般调用的是prototype方法, prototype方法除了调用上面的静态方法之外. 还加入了对节点上自定义事件的处理, 留在event部分再讲.
当然, 我们还需要删除缓存的方法. 现在看看removeData的代码
“inprogress”进程锁是这样工作的:
如果是dequeue操作, 去掉锁, 执行队列里的函数, 同时给队列加上锁. 如果是queue操作, 要看锁的状态, 如果被锁上了, 就只执行队列的添加操作. 不再调用dequeue.
其实dequeue和queue都可以执行队列里的第一个函数.queue操作添加完队列之后, 会调用dequeue方法去执行函数.
但是用dequeue执行函数的时候, 这时候如果又用queue触发dequeue的话, 很可能同时有2个函数在执行. 队列就失去一大半意义了(还是可以保证顺序, 但是2个动画会同时执行).
不过这个锁只能保证在dequeue的时候, 不被queue操作意外的破坏队列.
如果人为的同时用2个dequeue, 还是会破坏动画效果的. 所以要把fn写在回调函数里.
清空队列