jquery Callbacks方法实现

版本: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;
}

 

posted @ 2016-08-09 11:24  springmin  阅读(201)  评论(0编辑  收藏  举报