Callbacks还是很重要的,deferred对象是依赖callbacks的,而ajax的实现依赖deferred
参考
http://www.cnblogs.com/chaojidan/p/4165818.html
这篇文章里的注释很详细,但是自己的看的时候还是要集中注意力,而且自己要写写例子进行测试,记录一下自己觉得比较重要的地方
Callbacks包含如下几个比较重要的变量:
- 一个list,真正的事件序列
- 一个stack,用来兼容事件fire过程中,突然又有fire被触发的情况,这时候需要再次触发的事件就放在stack里面,不会放进list里,用了once就没有stack
- 一个self对象,调用$.Callbacks返回的对象
- 一个fire函数,真正的触发回调的函数
self里面比较重要的几个函数:
- add,用来添加事件,add里面有个自执行函数也叫add,自执行函数后面有个if…else if,是处理memory的地方,memory是不进入stack的,而是直接fire,
- remove,删除事件,
- disable,停止整个Callbacks,之前add的内容全部清除,后面再add也没用了,
- fire和fireWith,容易和外层的fire弄混,其实这两个只是调用外层的fire,往stack里面添加事件的操作就在fireWith里面,
比较重要的几条逻辑:
- createOptions把调用$.Callbacks时传入的参数转换成{once:true}这样的形式,方便后面处理
- 第一次add的时候,往list里面添加事件,然后fire了,这时如果使用了memory,在fire之后再调用add,是不会操作list的,而是直接触发fire
- fire过程中,如果又有fire事件发生,会存在stack里面,不会操作list,但是注意参考文章里面的那种写法,在add的函数里有一个fire,那是不行的,那种写法会导致stack在list执行的时候又被push进去一次,于是就一直在fire函数里嵌套执行,直到超过栈的上限
var cb = jQuery.Callbacks();
function a(){
cb.fire();// 不可以这样写
}
function b(){
}
cb.add(a,b);
cb.fire();