once:
once让这个callbacks中的函数运行一次之后就不再运行。原理非常的简单,上面的代码中,我们可以看见有一个变量list承接函数列表,所以我们只需要把过去执行过的代码清空即可。我们用一个全局变量,保存当前执行模型,如果是once模型,就在fireWith()里让这个list失效即可:
复制代码 代码如下:
(function (window, undefined) {
var Callbacks = function (once) {
//通过闭包保护这些私有变量
var list = [],//回调函数列表
fired;//是否执行过
//返回一个闭包的Callbakcs对象
return {
//...省略部分代码
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;
}
}
//如果配置了once模型,则全局变量once为true,则list重置
if (once) list = undefined;
return this;
}
//...省略部分代码
};
};
//注册到window下
window.Callbacks = Callbacks;
}(window));
auto: