导读:作者GrayZhang写了一篇关于jQuery 1.5的文章《jQuery1.5的改进细节》,他总结出jQuery 1.5 beta1改进的内容,以下是文章内容: jQuery 1.5 beta1出来了,从学习跟进上来说,这一次已经比较晚了(我竟然不知道1.5什么时候出的alpha,就这么beta了)。 这个1.5版本最大的更新是AJAX的完全重写,提供了更强的可扩展性。但是受制于精力和篇幅,对新的AJAX的分析还是放到下回,本篇先简单介绍一下细节方面的改进。 jQuery._Deferred和jQuery.Deferred 首先不得不说这两个新生事物,因为他们是作为基础设施存在,不把这两个东西讲明白了,有些问题根本没办法解释。 首先,jQuery.Deferred是jQuery._Deferred的增强版,因此对于这个问题,从jQuery._Deferred入手,就能说明一大半的问题。 什么是Deferred?从字面上看,我的第一反应是“延迟加载”,首字母大写的应该是“类型”的定义,所以这大概是一个“透明提供延迟加载功能”的类型吧。然而实际上,虽然确实带有那么一点点“延迟”的意思,这个东西却不是用来实现延迟加载的。 简单来说,jQuery._Deferred是一个函数队列,他的作用有以下几点: 1. 保存若干个函数。 2. 在特定的时刻把保存着的函数全部执行掉。 3. 执行过后,新进来的函数会立刻执行。 感觉是不是和啥东西很像?对,jQuery的ready函数就是这样的逻辑,实际中jQuery 1.5中的ready函数也确实被嫁接到这上面去了。 jQuery._Deferred提供下面的接口: 1. done:function(fn1, fn2, …)的形式,用于把函数添加到队列中。 2. fire:function(context, args)的形式,使用context指定this对象,args指定参数,调用队列中所有函数。fire被调用后,_Deferred会进入 isResolved状态,未来对done的调用不会再保存函数,而是直接调用函数。 3. resolve:相当于调用fire(this, arguments),一个简化的方法。 4. isResolved:用来判断_Deferred是否在isResolved状态,具体参考前面的fire函数的解释。 5. cancel:取消掉整个队列,这样不管未来是不是fire,队列中的函数都不会再被调用。 说明白了jQuery._Deferred,再来看看jQuery.Deferred。这个东西其实就是2个_Deferred组成的,第一个称为 deferred,用于保管“正常”状态下的函数;第二个称为failDeferred,用于保管“出错”状态下的函数。同时 jQuery.Deferred提供了一些新的接口: 1.then:function(done, fail)的形式,把done添加进deferred,把fail添加进failedDeferred。 2. fail:相当于failDeferred的done函数。 3. fireReject:相当于failDeferred的fire函数。 4. reject:相当于failDeferred的resolve函数。 5. isRejected:相当于failDeferred的isResolved函数。 同时jQuery.Deferred取消了cancel函数。 那么这个是啥用的呢?有“正常”和“出错”2个状态,同时又是异步的,很容易就能想到……对,给AJAX用的,在下一篇分析中再详细说明。 jQuery.ready的变化 因为有了jQuery._Deferred这个东西,jQuery.ready函数变成依赖于函数队列,具体的变化有: 原来的readyList变量已经不再是一个数组,而变成了jQuery._Deferred对象。 [...]