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;
    }
  • 相关阅读:
    Sum Root to Leaf Numbers 解答
    459. Repeated Substring Pattern
    71. Simplify Path
    89. Gray Code
    73. Set Matrix Zeroes
    297. Serialize and Deserialize Binary Tree
    449. Serialize and Deserialize BST
    451. Sort Characters By Frequency
    165. Compare Version Numbers
    447. Number of Boomerangs
  • 原文地址:https://www.cnblogs.com/fe-huahai/p/5748346.html
Copyright © 2011-2022 走看看