• jQuery之回调函数列表对象Callbacks


    ¥.Callbacks是在版本1.7中新参加的。它是一个多用处的回调函数列表对象,供给了一种强大的办法来经管回调函数队列。

    全部¥.Callbacks的源码不到200行,它是一个工厂函数,应用函数调用体式格式(非new,它不是一个类)创建对象,它有一个可选参数flags用来设置回调函数的行动。

    ¥.Callbacks是在jQuery内部应用,如为¥.ajax,¥.Deferred等组件供给根蒂根基功能的函数。它也可以用在类似功能的一些组件中,如本身开辟的插件。

    ¥.Callbacks机关的对象(以callbacks示例)首要包含以下办法:

    1. callbacks.add
    2. callbacks.remove
    3. callbacks.has
    4. callbacks.empty
    5. callbacks.disable
    6. callbacks.fire
    7. callbacks.fireWith
    8. callbacks.fired
    9. callbacks.lock
    10. callbacks.locked

    1. callbacks.add 添加一个函数到回调队列


    function fn1() {
    console.log(1)
    }
    function fn2() {
    console.log(2)
    }

    var callbacks = ¥.Callbacks();
    // 体式格式1
    callbacks.add(fn1);
    // 体式格式2 一次添加多个回调函数
    callbacks.add(fn1, fn2);
    // 体式格式3 传数组
    callbacks.add([fn1, fn2]);
    // 体式格式4 函数和数组掺和
    callbacks.add(fn1, [fn2]);

    传数组进去现其实add内部断定若是是数组会递归调用私有的add函数。此外,需重视add办法不去重,比如fn1添加两次,fire时会触发两次。私有add办法有趣,它应用了签字函数立即履行其名仅在函数内可用。如图中所圈之处

    2. callbacks.remove 从回调队列中删除一个函数


    function fn1() {
    console.log(1)
    }
    function fn2() {
    console.log(2)
    }
    var callbacks = ¥.Callbacks();
    callbacks.add(fn1, fn2);
    callbacks.remove(fn1);

    此时fire只会触发fn2了。

    此外remove办法会把添加多次的函数如fn1,全部删除掉。如下


    var callbacks = ¥.Callbacks();
    callbacks.add(fn1, fn2, fn1, fn2);
    callbacks.remove(fn1);

    此时会把add两次的fn1都删掉,fire时只触发fn2两次。

    3. callbacks.has 断定是否添加过某回调函数,不想反复添加时很有效


    function fn1() {
    console.log(1)
    }
    var callbacks = ¥.Callbacks();
    callbacks.add(fn1);
    if (!callbacks.has(fn1)) {
    callbacks.add(fn1);
    }

    4. callbacks.empty 清空所有的回调函数


    function fn1() {
    console.log(1)
    }
    function fn2() {
    console.log(2)
    }
    var callbacks = ¥.Callbacks();
    callbacks.add(fn1);
    callbacks.add(fn2);
    callbacks.empty();

    此时再fire不会触发任何函数。empty函数实现很简单,只是把内部的队列经管对象list重置为一个空数组。这里可以懂得清空数组的几种体式格式。

    5. callbacks.disable 禁用该对象


    function fn1() {
    console.log(1)
    }
    function fn2() {
    console.log(2)
    }
    var callbacks = ¥.Callbacks();
    callbacks.disable();
    callbacks.add(fn1); // 不起感化
    callbacks.add(fn2); // 不起感化
    callback.remove(fn1); // 不起感化
    callbacks.fire(); // 不起感化

    调用后再应用add, remove, fire等办法均不起感化。该办法内不是实际是将队列经管对象list、stack、memory都置undefined了。

    6. callbacks.fire 主动触发添加回调函数


    function fn() {
    console.log(this); // 高低文是callbacks
    console.log(arguments); // [3]
    }
    var callbacks = ¥.Callbacks();
    callbacks.add(fn);
    callback.fire(3);

    前面已经提到了,fire办法用来触发还调函数,默认的高低文是callbacks对象,还可以传参给回调函数。

    7. callbacks.fireWith 同fire,但可以指定履行高低文


    function fn() {
    console.log(this); // 高低文是person
    console.log(arguments); // [3]
    }
    var person = {name: ""jack""};
    var callbacks = ¥.Callbacks();
    callbacks.add(fn);
    callback.fireWith(person, 3);

    其实fire内部调用的是fireWith,只是将高低文指定为this了,而this恰是¥.Callbacks机关的对象。

    8. callbacks.fired 断定是否有主动触发过(调用fire或fireWith办法)


    function fn1() {
    console.log(1)
    }
    var callbacks = ¥.Callbacks();
    callbacks.add(fn1);
    callbacks.fired(); // false
    callbacks.fire();
    callbacks.fired(); // true

    重视,只要调用过一次fire或fireWith就会返回true。

    9. callbacks.lock 锁定队列的状况 

    10. callbacks.locked 断定是否锁定状况

    ******************************************************************************************* 

    ¥.Callbacks的参数Flags是可选的,字符串类型以空格分隔,有如下

    1. once
    2. memory
    3. unique
    4. stopOnFalse

     1. once 确保回调函数仅履行一次


    function fn() {
    console.log(1)
    }
    var callbacks = ¥.Callbacks(""once"");
    callbacks.add(fn);
    callbacks.fire(); // 打印1
    callbacks.fire(); // fn不再触发

       2. memory 记忆callbacks


    function fn1() {
    console.log(1)
    }
    function fn2() {
    console.log(2)
    }
    var callbacks = ¥.Callbacks(""memory"");
    callbacks.add(fn1);
    callbacks.fire(); // 必须先fire
    callbacks.add(fn2); // 此时会立即触发fn2

    memory有点绕,本意是记忆的意思。实际它的用法有点诡异,需连络特定场景来看(如jQuery.Deferred)。当初次调用fire后,之后每次add都会立即触发。比如先callbacks.fire(),再callbacks.add(fn1),这时fn1会立即被调用。

      若是是批量添加的,也都会被触发


    function fn1() {
    console.log(1)
    }
    function fn2() {
    console.log(2)
    }
    function fn3() {
    console.log(3)
    }
    var callbacks = ¥.Callbacks(""memory"");
    callbacks.add(fn1);
    callbacks.fire();
    callbacks.add([fn2, fn3]); // output 2, 3

       3. unique 去除反复的回调函数


    function fn1() {
    console.log(1)
    }
    function fn2() {
    console.log(2)
    }
    var callbacks = ¥.Callbacks(""unique"");
    callbacks.add(fn1);
    callbacks.add([fn1, fn2]); // 再次添加fn1
    callbacks.fire(); // output 1, 2

    这个很好懂得,之前用has断定去重,应用unique属性则更便利。本例先add一次fn1,第二次再add时内部则会去重。是以最后fire时只输出“1,2”而不是“1,1,2”。

        4. stopOnFalse 回调函数返回false时中断回调队列的迭代


    function fn1() {
    console.log(1)
    }
    function fn2() {
    console.log(2)
    return false // 重视这里
    }
    function fn3() {
    console.log(3)
    }
    var callbacks = ¥.Callbacks(""stopOnFalse"");
    callbacks.add(fn1, fn2, fn3);
    callbacks.fire(); // 1,2

    从该属性名就能知了它的意图,即回调函数经由过程return false来停止后续的回调履行。该示例添加了3个回调,fn2中应用return false,当fire履行到fn2时会停止履行,后续的fn3就不会被调用了。

          注:浏览版本为1.8.3

    静守己心,看淡浮华
  • 相关阅读:
    程序清单 8-8 exec函数实例,a.out是程序8-9产生的可执行程序
    程序清单8-9 回送所有命令行参数和所有环境字符串
    程序清单8-3 8-4 演示不同的exit值
    C和指针 3.9作用域、存储类型示例
    程序4-6 utime函数实例
    程序4-5 打开一个文件,然后unlink
    C和指针笔记 3.8 static关键字
    C和指针笔记 3.7 存储类型
    C和指针笔记 3.6链接属性
    python爬虫<urlopen error [Errno 10061] >
  • 原文地址:https://www.cnblogs.com/jianglingli83/p/2944596.html
Copyright © 2020-2023  润新知