backbone event 事件訂閱 和發佈 源碼小讀

nodejs有eventEmitter 類,想到backbone  有個event模塊 能夠對對象作事件綁定和觸發,是backbone的核心模塊。javascript

backbone event模塊java

  • on 添加自定義事件
  • off 刪除自定義事件
  • trigger 派發自定義事件
  • once 添加只執行一次的自定義事件 (內部依賴於_.once)
  • listenTo 添加一個觀察對象
  • listenToOnce 添加一個僅執行一次的觀察對象
  • stopListening 刪除添加的觀察對象
------------------------------------
on:綁定事件的方法
   on: function(name, callback, context) {
      if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
      this._events || (this._events = {});
      var events = this._events[name] || (this._events[name] = []);
      events.push({callback: callback, context: context, ctx: context || this});
      return this;
    },

在當前的bancbone.event 的實例上添加_events 屬性,全部經過backbone.events 訂閱的事假, 都在這個哈希表上。node

_events 的結構,先哈希後數組,其中 ctx, context賦值回調函數的this數組

    _events={
        eventName:[handlerObj,handlerObj,handlerObj],
        eventName:[{callback:function(){}, context: Object, ctx: Object}]
    }

trigger:   性能優化

  trigger: function(name) {
      if (!this._events) return this;
      var args = slice.call(arguments, 1);  /*得到傳入callback的參數類型數組 */
      if (!eventsApi(this, 'trigger', name, args)) return this;
      var events = this._events[name];
      var allEvents = this._events.all;
      if (events) triggerEvents(events, args);//triggerEvents 針對 apply  call作了性能優化
      if (allEvents) triggerEvents(allEvents, arguments); //若是 當前實例有事件名爲all的事件,在觸發完指定的name事件後還會觸發all的事件
      return this;
    }

  

triggerEvents :執行_events[name]中的方法
官方解釋由於call的性能比apply好 ,因此三個參數如下都使用call,三個參數以上才使用apply,大神的要求就是這麼高
  var triggerEvents = function(events, args) {
    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
    switch (args.length) {
      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx);return;
      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;
    }
  };
相關文章
相關標籤/搜索