jQuery Callbacks

媒介

$.Callbacks用来治理函数行列。采纳了观察者情势,经由过程add增加操纵到行列当中,经由过程fire去实行这些操纵。实际上$.Callbacks是1.7版本从$.Deferred对象当中分离出来的,主如果完成$.Deferred功用。

API

$.Callbacks

我们经由过程挪用$.Callbacks获取到一个callback实例,以下

var cb = $.Callbacks();

看到Callbacks首字母大写,有些人可能会以为平常只要对象才会如许,因而须要new一个实例,以下

var cb = new $.Callbacks();    

实际上这两种体式格局都能够,因为Callbacks函数返回值是一个对象,为何会如许?看下面一组对照

function Cons() {
    this.name = 'this.name';

    return {
        name: 'obj.name'
    };
}

console.log(Cons().name);//obj.name
console.log(new Cons().name);//obj.name

function Cons() {
    this.name = 'this.name';

    return 'str.name';
}

console.log(Cons());//str.name
console.log(new Cons().name);//this.name

当函数的返回值是一个对象时(null除外),new和直接挪用二者的返回值是一样的。然则须要注重了,二者的this指向是不一样的。为了尽量的节约代码和防止杂沓我们照样一致采纳var cb = $.Callbacks();的体式格局去挪用。

像这类先挪用获取到实例,然后经由过程实例举行一系列的操纵,很明显利用了闭包特征。

add

向内部行列增加函数,总有三种参数情势

单个函数参数

var cb = $.Callbacks();

cb.add(function () {
    console.log('add one');
});

多个函数参数

var cb = $.Callbacks();

cb.add(function () {
    console.log('add one');
}, function () {
    console.log('add two');
});

数组参数

var cb = $.Callbacks();

cb.add([
    function () {
        console.log('add one');
    }, function () {
        console.log('add two');
    }
]); 

fire

顺次实行行列里的函数

var cb = $.Callbacks();

cb.add([
    function () {
        console.log('add one');
    }, function () {
        console.log('add two');
    }
]);

cb.fire();
//add one
//add two

fire的参数会通报给我们增加的函数,比方

var cb = $.Callbacks();

cb.add(function (name, age) {
    console.log(name, age);
});

cb.fire('Jacky', 26);//Jacky 26

fireWith

fire挪用的时刻,我们增加函数当中的this指向我们的Callbacks实例,比方

var cb = $.Callbacks();

cb.add(function () {
    console.log(this === cb);
});

cb.fire();//true

fireWith就是转变我们增加函数的context,即this指向,比方

var cb = $.Callbacks();

var obj = {
    name: 'objName'
};

cb.add(function (age) {
    console.log(this.name, age);
});

cb.fireWith(obj, [26]);//objName 26

fireWith第一个参数是我们的context,第二个参数是我们须要通报的内容数组,注重了是数组!

empty

清空函数行列

var cb = $.Callbacks();

cb.add(function () {
    console.log('add one');
});

cb.empty();
cb.fire();

has

推断函数行列中是不是存在某个函数

var cb = $.Callbacks();

function demo() {
    console.log('demo');
}
cb.add(demo);
console.log(cb.has(demo));//true

函数通报的都是援用,千万别涌现以下的初级毛病

var cb = $.Callbacks();

cb.add(function () {
    console.log('demo');
});
cb.has(function () {
    console.log('demo');
});

remove

从内部行列中移除某些函数

var cb = $.Callbacks();

function demo1() {
    console.log('demo1');
}

function demo2() {
    console.log('demo2');
}

cb.add(demo1, demo2);
cb.remove(demo1, demo2);
cb.fire();

disable

禁用回调列表。这类状况会清空函数行列,禁用中心功用。意味着这个回调治理报废了。

var cb = $.Callbacks();

cb.add(function () {
    console.log('add');
});

cb.disable();
cb.fire();

disabled

回调治理是不是被禁用

var cb = $.Callbacks();

cb.add(function () {
    console.log('add');
});

cb.disable();
console.log(cb.disabled());//true

lock

锁定回调治理,同disable,唯一的差异会在下面表述

locked

回调治理是不是被锁

fired

回调行列是不是实行过

var cb = $.Callbacks();

cb.add(function () {
    console.log('add');
});

cb.fire();//add
console.log(cb.fired());//true

$.Callbacks()

$.Callbacks经由过程字符串参数的情势支撑4种及以上的特定功用。很明显的一个工场情势。

once

函数行列只实行一次。参考以下对照

//不增加参数 
var cb = $.Callbacks();

cb.add(function () {
    console.log('add');
});

cb.fire();//add
cb.fire();//add

//增加参数
var cb = $.Callbacks('once');

cb.add(function () {
    console.log('add');
});

cb.fire();//add
cb.fire();

函数行列实行过今后,就不会在实行了,不管挪用fire多少次。

unique

往内部行列增加的函数坚持唯一,不能反复增加。参考以下对照

//不增加参数
var cb = $.Callbacks();

function demo() {
    console.log('demo');
}
cb.add(demo, demo);

cb.fire();
//demo
//demo

//增加参数
var cb = $.Callbacks('unique');

function demo() {
    console.log('demo');
}
cb.add(demo, demo);

cb.fire();//demo

雷同的函数不会被反复增加到内部行列中

stopOnFalse

内部行列里的函数是顺次实行的,当某个函数的返回值是false时,住手继承实行剩下的函数。参考以下对照

//不增加参数
var cb = $.Callbacks();

cb.add([
    function () {
        console.log('add one');
    },
    function () {
        console.log('add two');
    }
]);

cb.fire();
//add one
//add two

//增加参数
var cb = $.Callbacks('stopOnFalse');

cb.add([
    function () {
        console.log('add one');
        return false;
    },
    function () {
        console.log('add two');
    }
]);

cb.fire();//add one

注重了返回值肯定如果false,像undefined、null这类作为返回值是没有结果的

memory

当函数行列fire或fireWith一次事后,内部会纪录当前fire或fireWith的参数。当下次挪用add的时刻,会把纪录的参数通报给新增加的函数并马上实行这个新增加的函数。看个例子

var cb = $.Callbacks('memory');

cb.add(function (name) {
    console.log('one', name);
});

cb.fire('Jacky');//first Jacky

cb.add(function (name) {
    console.log('two', name);
});//two Jacky

比方公司指导在9点的时刻发了封邮件,请求人人提交本身的年末闭幕,这就相当于fire操纵了,在公司里的员工收到邮件后,立马提交了。小李因为告假,下昼才过来,看到邮件后也提交了本身的年末总结。不须要指导再次发送邮件提示。

fire或fireWith肯定要在disabled或lock前先实行一遍,memory才会起作用

小结

这四种基础范例能够互相组合起来运用,比方$.Deferred就运用了once和memory的组合。

jQuery.Callbacks("once memory")

disable和lock的区分

二者唯一的区分就是增加了memory参数,看一下对照

var cb = $.Callbacks('memory');

cb.add(function () {
    console.log('one');
});
cb.fire();
cb.disable();
//cb.lock();
cb.add(function () {
    console.log('two');
});

毫无疑问,disable就是禁用一切功用,不管增加什么参数。而在memory的状况下,fire事后在lock,继承add新的函数依旧会马上实行。

总结

$.Callbacks在一百多行的代码里就用到了两种设想情势,确切典范。固然了这都是纯属个人见解。因为日常平凡用的很少,很遗憾没有举出代表性的例子供人人参考,毕竟我辈的目的是学以致用。

    原文作者:小俞
    原文地址: https://segmentfault.com/a/1190000004331027
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞