add(function) - 添加一个(或多个)函数到Callbacks对象中:当然,如果你并不添加函数只是好奇看看Callbacks,我们也将让你继续享受你的乐趣——我们并不会抛出异常,因为这对于我们来说并不擅长。
remove(function) - 移除一个Callbacks中的一个函数:既然有了添加,那么我们也应该提供反悔的方案,我们是多么的平易近人,容忍着别人过去所做的一切。
has(function) - 判断Callbacks中是否包含一个函数:哦?你竟然不确定是否包含这个函数,当初可是你丢进来的啊!你怎么如此马虎?不过既然你问我的话,我仍然会告诉你Callbacks是否包含这个函数,我知道你很繁忙,并不能记住和确定所有的事情。
empty() - 清空Callbacks:这些函数对于你失去了意义了么?什么?已经执行过你就不想要了?所以你希望可以清空它?好吧,为了内存君我还是忍下你这个需求。
disable() - 废掉一个Callbacks:为了和别人的代码稳定的存在,我选择了自我牺牲——没错,这个方法可以废掉Callbacks,彻底的废掉,就如同它曾经尚未存在过一般。
disabled() - 判断这个Callbacks是否已经被废掉:如果你仍然不相信Callbacks是否真的自我牺牲,那么这个方法可以让你安心。
lock(boolean) - 锁定这个Callbacks对象:你害怕它并不稳定,但是你又不想舍弃它,lock是个不错的方法,它接收一个Boolean的参数,表示是否需要锁定这个对象,当然,无参的它用于让你确定Callbacks是否被锁定。
fire(data) - 执行这个Callbacks中的函数:我们做的这一切,不都是为了这一刻执行的宿命么?参数将会成为这些需要执行的函数的参数。
fireWith(context,data) - 执行Callbacks中的函数,并且指定上下文。在fire()里,所有的函数的Context(上下文)都是Callbacks对象,而fireWidth(),可以让你重新定义这些要执行的函数的上下文,多么自由的编程啊,Callbacks为你考虑了一切。
fired() - 判断这个Callbacks过去是否已经执行过:我们相信,多数时候你并不知道过去做过什么,但是我们记录了你做的一切,如果你过去曾经执行过这个Callbacks对象,那么你休想否认,因为我们知道过去你是否执行了这个Callbacks。
基本模块实现
简单的实现:
我们先来简单的实现一个Callbacks:
复制代码 代码如下:
(function (window, undefined) {
var Callbacks = function () {
//通过闭包保护这些私有变量
var list = [],//回调函数列表
fired;//是否执行过
//返回一个闭包的Callbakcs对象
return {
add: function (fn) {
//当Callbacks废弃掉的时候,list为undefined
if (list) {
//添加一个回调函数
list.push(fn);
//支持链式回调
}
return this;
},
fireWith: function (context, data) {
//触发回调函数,并指定上下文
if (list) {
fired = true;
for (var i = 0, len = list.length; i < len; i++) {
//当Callbacks中某一个函数返回false的时候,停止Callbacks后续的执行
if (list[i].apply(context, data) === false)
break;
}
}
return this;
},
fire: function () {
//触发回调函数
//调用fireWith并指定上下文
return this.fireWith(this, arguments);
},
empty: function () {
//清空list即可
if (list)//当这个Callbacks废弃掉的时候,Callbacks不应该可以继续使用
list = [];
return this;
},
disable: function () {
//废弃这个Callbacks对象,后续的回调函数列表不再执行
list = undefined;
return this;
},
disabled: function () {//检测这个Callbacks是否已经废掉
//转换为boolean返回
return !list;
},
fired: function () {//这个callbacks是否执行过
return !!fired;
}
};
};
//注册到window下
window.Callbacks = Callbacks;
}(window));
然后我们测试一下这个Callbacks:
复制代码 代码如下: