但是在jQuery里采用了更奇妙的用法,获取jQuery作者也自豪这种用法,所以命名这个模型为memory——就是让上面的变量auto不仅仅表示当前是auto执行模式,并且作为最后一次参数的容器,它既表示了auto,也表示了memory。(下面的代码非jQuery是根据jQuery代码思路而写,非源码):
复制代码 代码如下:
(function (window, undefined) {
var Callbacks = function (auto) {
var list = [],
fired,
memory,//主演在这里,就是memory
coreFire = function (data) {
//真正的触发函数方法
if (list) {
//&&表达式妙用
memory = auto && data;//记录最后一次的参数,如果不是auto模式则不会记录这个参数
//如果是auto模式,那么这个auto将不会为false,它会是一个数组
fired = true;
for (var i = 0, len = list.length; i < len; i++) {
if (list[i].apply(data[0], data[1]) === false)
break;
}
}
};
return {
add: function (fn) {
if (list) {
//添加一个回调函数
list.push(fn);
//自动执行模式,注意如果auto模型
//memory是在coreFire()里赋值的,默认是false
if (memory) coreFire(auto);
}
//支持链式回调
return this;
},
fireWith: function (context, data) {
if (once) list = [];
//这里调用coreFire,把参数转换为数组了
coreFire([context, data]);
return this;
}
/*部分代码省略*/
};
};
window.Callbacks = Callbacks;
}(window));