版本:1.7.1
jQuery.Callbacks(flags)
调用Callbacks方法后,返回一个用于处理回调函数队列的对象,对象包含有add,remove,fire,fireWith,fired,lock,locked,disable,
disabled,has,empty方法用于管理和操作回调函数队列,回调函数队列以数组的形式存储在函数Callbacks作用域内,通过闭包机制返回的回调对象操作回调函数队列。
参数flags
取值:once memory unique stopOnFalse
once:确保回调函数对列只能触发一次
memory:记录fire函数传入的参数值,之后通过add方法添加一个或多个函数时,函数立即执行,并且使用的参数时记录的通过fire传入的值。
unique:确保回调函数队列中没有重复的函数。
stopOnFalse:当某个回调函数返回false时,中断回调函数队列中后面的函数继续执行。
若没有给flags赋值,回调对象处理回调队列的行为类似监听函数,能够多次触发。
若有参数值,可以是一个,也可以是通过隔开的多个值的集合。
add(fn,[fn,fn..],fn...)
添加一个或一组回调函数到回调队列中。传入的参数可以是单个函数,也可以是有函数组成的数组。
remove(fn,fn,fn,...)
从回调函数队列中删除一个或一组回调函数。传入的参数形式是单个数组。
fire(arg)
使用arg参数出发回调队列中的所有回调函数。
fieWith(context,arg)
使用指定的上下文和参数触发回调队列中的所有回调函数。
fired()
判定回调函数是否被触发过。
lock()
锁定回调函数队列。
locked()
判断回调函数队列是否被锁定。
has(fn)
检测回调函数fn是否在回调函数队列中。
empty()
把回调队列置空。
源码分析
1.总体结构
var flagCache = {};//缓存flags的值
//把flags值(以空格分隔的字符串)转化为对象形式表示
function createFlags(flags){}
jQuery.Callbacks = function(flags){
//检查flagCache缓存中是否有flags值,若有直接使用flagsCache存储的值的对象表示形式,若没有缓存,重新把字符串格式转化为对象的形式,返回给flags
flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
var
list = [];//存放回调函数队列
stack = [];//存放触发函数fire执行的队列
memory,//记录回调函数是否被触发过,是否是memory模式以及上一次fire传的参数值
firing,//回调函数是否在执行
firingStart,//将要执行的第一个回调函数的下标
firingLengh,//执行回调函数的长度
firingIndex,//正在执行的回调函数的下标
add = function(args){},//添加一个或几个回调函数的工具方法
fire = function(context, args){},//触发回调函数的工具方法
self ={
add:function(){},//添加回调函数
remove:function(){},//删除回调函数
has:function(fn),//判断回调函数fn是否在回调队列中
empty:function(),//把回调队列置为空
disable:function(),//禁用回调队列
disabled:function(),//判断回调队列是否被禁用
lock:function(),//锁定回调队列
locked:function(),//判断回调列表是否被锁定
fireWith:function(context,args){},//根据指定的上下文和参数触发回调队列
fire:function(){},//根据指定的参数触发回调队列
fired:function()//判断回调队列是否被触发过
};
return self;
}
分析:
(1)根据传入的flags的值来确定管理回调队列的方式,以带有空格的字符串的形式传入。并且把传入的字符串形式转化为对象表示形式,并且把对象表示形式缓存到对象flagCache中,在以后调用时,若缓存中有这个字符串的对象表示形式,直接使用缓存的对象表示形式,而不用重新字符串转化为对象表示形式。
(2)在Callback函数作用域中定义了几个数据变量、两个工具方法以及向外提供接口的回调对象。回调对象使用了闭包机制对数据变量操作及使用两个工具方法。
2.方法实现
createFlags(flags)
//存储字符串转化为对象形式的缓存 var flagsCache = {}; //把字符串表示形式转化为对象表示形式 function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; }