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

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会在addfire时运行

  • 第一次add时,由于memory没有值,因此不运行_fire
  • 紧接着运行firefire里面调用_fire,此时data为‘1’,memory 被赋值为1firingIndex为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的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值