3.Callbacks

Callbacks还是很重要的,deferred对象是依赖callbacks的,而ajax的实现依赖deferred

参考
http://www.cnblogs.com/chaojidan/p/4165818.html

这篇文章里的注释很详细,但是自己的看的时候还是要集中注意力,而且自己要写写例子进行测试,记录一下自己觉得比较重要的地方

Callbacks包含如下几个比较重要的变量:

  1. 一个list,真正的事件序列
  2. 一个stack,用来兼容事件fire过程中,突然又有fire被触发的情况,这时候需要再次触发的事件就放在stack里面,不会放进list里,用了once就没有stack
  3. 一个self对象,调用$.Callbacks返回的对象
  4. 一个fire函数,真正的触发回调的函数

self里面比较重要的几个函数:

  1. add,用来添加事件,add里面有个自执行函数也叫add,自执行函数后面有个if…else if,是处理memory的地方,memory是不进入stack的,而是直接fire,
  2. remove,删除事件,
  3. disable,停止整个Callbacks,之前add的内容全部清除,后面再add也没用了,
  4. fire和fireWith,容易和外层的fire弄混,其实这两个只是调用外层的fire,往stack里面添加事件的操作就在fireWith里面,

比较重要的几条逻辑:

  1. createOptions把调用$.Callbacks时传入的参数转换成{once:true}这样的形式,方便后面处理
  2. 第一次add的时候,往list里面添加事件,然后fire了,这时如果使用了memory,在fire之后再调用add,是不会操作list的,而是直接触发fire
  3. 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();

猜你喜欢

转载自blog.csdn.net/u011393161/article/details/80233109