zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    多线程
    异常
    接口
    多态
    对象和封装
    DIV+CSS命名规范集合
    MySql 最新官方安装教程-下载
    乐嘉性格色彩-4色特性,学习感悟
    Eclipse 的常用快捷方式
    学习方法_2011年编写和锻炼的思维题
  • 原文地址:https://www.cnblogs.com/fe-huahai/p/5748346.html
Copyright © 2011-2022 走看看