2014-12-22 75 views
3

我正在通過Backbone源代碼閱讀,並且遇到了在內部使用的triggerEvents函數。該函數包括評論「難以置信,但優化的內部調度功能」,我很好奇是否有更多的JavaScript內部機制知識的人可以用什麼方式解釋它的優化方式。 :Backbone.js內部的triggerEvents函數。它是如何優化的?

// A difficult-to-believe, but optimized internal dispatch function for 
// triggering events. Tries to keep the usual cases speedy (most internal 
// Backbone events have 3 arguments). 
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; 
    } 
}; 

回答

4

Function.prototype.apply是基本相同Function.prototype.call,與打破了參數數組參數的方式多一點邏輯使用call明確,而不是apply這種方式更加優化,因爲它只經歷。如果有3個以上的參數,則需要額外的邏輯

參見:ECMAScript 5 call VS apply spec

無論哪種方式,在ECMAScript中6兩種功能將有尾調用優化的,其基本上「回收」的功能而不是與相同功能的附加呼叫的。

ECMAScrip 6 call & apply spec