您的位置:首页 > Web前端 > JQuery

jQuery源码分析-----CallBacks--memory

2017-07-07 11:33 661 查看

memory的精华是用本次add的方法call上次add的cb参数

function CallBacks(options) {
var list = [];
var self;
var memory;
var firingStart;
var firingIndex;

function _fire(data) {
memory = options === 'memory' && data;
firingIndex = firingStart || 0;
firingStart = 0;
for (var i = firingIndex; i < list.length; i++) {
list[i](data);
}
}

self = {
add: function (fn) {
var start = list.length;
list.push(fn);
if (memory) {
//若有memory参数,每次先执行上次list的最后一个cb
firingStart = start;
_fire(memory);
}
},
fire: function (args) {
if (list) {
_fire(args);
}
}
}
return self;
}
function fn1(val) {
console.log('fn1 ' + val);
}
function fn2(val) {
console.log('fn2 ' + val);
}
function fn3(val) {
console.log('fn3 ' + val);
}

var cbs = CallBacks('memory');
cbs.add(fn1);
cbs.fire('1');

cbs.add(fn2);
cbs.fire('2');

cbs.add(fn3);
cbs.fire('3');


运行结果如下:

分析:私有方法
_fire
会在
add
fire
时运行

第一次
add
时,由于
memory
没有值,因此不运行
_fire


紧接着运行
fire
fire
里面调用
_fire
,此时data为‘1’,
memory
被赋值为
1
firingIndex
为0,运行list中所有的方法
打印(fn1 1)


第二次add,由于
memory
为‘1’,
firingStart
为1,运行
_fire,data
为‘1’,
firingIndex
为1, 将 startStart赋为0,list.length为2, 只运行index为1的方法,参数为‘1’,即
打印(f2 1)
;接着运行
fire(2)
,从index为0开始以参数‘2’运行所有方法,
打印(fn1 2,fn2 2)


将‘2’赋值 给
memory
;再次add,
firingStart
为2,
firingIndex
为2,将
firingStart
赋为0,只运行
index
为2的任务即刚加进来的任务,
data
为‘2’,
打印(fn3 2)


接着运行
fire(3)
,从
index
为0开始以参数‘3’运行所有方法,
打印(fn1 3,fn2 3,fn3 3),
将‘3’赋值 给 memory;

总结:每次add时都要运行add进来的方法,参数为上次fire的值。fire时运行所有方法,参数为fire的参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jquery