nodejs有eventEmitter 類,想到backbone 有個event模塊 能夠對對象作事件綁定和觸發,是backbone的核心模塊。javascript
backbone event模塊java
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; }
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; } };