2013-02-19 54 views
0

我通過Backbone.js的源讀取和我這個骨幹triggerEvents變量

var triggerEvents = function(events, args) { 
    var ev, i = -1, l = events.length; 
    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, args[0]); 
    return; 
    case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1]); 
    return; 
    case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1], args[2]); 
    return; 
    default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); 
    } 
}; 

我有一些問題 -

  1. 困惑,爲什麼這是觸發事件的優化(正如註釋的來源所說)?
  2. 什麼是ev.ctx?
  3. .callback()是什麼?

這種結構意味着,如果給每個人都應該使用的呼叫,而不是在速度上的利益提出申請,因爲該功能的結構的機會,似乎在說:「如果我知道有多少ARGS有使用電話,相反,使用應用「,當一個人可以使用一路通過。

總之,我不確定這個函數的目的是什麼,爲什麼它被寫入了它的寫法,如果有人能告訴我這將是偉大的!

回答

3

我創建了一個小型JSPerf test suite,它比較了Function.callFunction.apply的性能。它很清楚地表明(使用Chrome 24)Function.call的速度提高了30-50%。嘗試在瀏覽器中運行它,看看性能有何不同。

但是,這並不意味着您應該在您自己的代碼中遵循此優化。 Backbone事件功能是Backbone的核心,並且事件被激發。作者已經優化了這段代碼,從中擠出了最後一部分的性能。在大多數其他情況下,這將是過度優化。

ev.callback屬性是事件的回調函數。

考慮下面的例子:

this.model.on('change', this.handleChange, this); 

在這種情況下,回調是this.handleChange方法。

的符號(ev = events[i]).callback.call僅僅是

ev = events[i]; 
ev.callback.call 

的快捷方式工作的快捷方式,因爲在JavaScript賦值操作返回指定的值。

ev.ctx屬性另一方面是作爲this上下文綁定到回調函數的對象。 Backbone.Events.on將上下文作爲可選參數。在上面的例子中,最後一個參數this指定回調函數的上下文應該是包含的類。

+0

謝謝 - 這真的有幫助=) – praks5432 2013-02-19 22:51:40