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 2.0.3 源码分析 回调对象 - Callbacks
- jQuery源码分析之Callbacks详解
- jQuery源码分析之Callbacks详解
- jQuery源码分析: 如何安全地访问一个数组?(jQuery.Callbacks)
- jQuery 2.0.3 源码分析 回调对象 - Callbacks
- jquery源码分析:回调函数-Callbacks
- jquery源码分析之Callbacks
- jQuery源码分析之Callbacks方法
- jQuery1.9.1源码分析--Callbacks对象
- jQuery1.3.2 源码学习-4 init 函数分析 - 2
- jQuery1.3.2 源码学习-3 init 函数分析 - 1
- jQuery源码分析之Event事件分析
- jQuery 源码剖析-4 init 函数分析
- jQuery 源码分析 -1 $是什么?
- jquery1.43源码分析之工具方法
- Jquery源码分析(一)
- jQuery源码分析---Event分析
- Jquery源码分析---Ajax分析。
- jQuery源码分析-构造函数详解
- jquery core 源码分析