Backbone.js内部的triggerEvents函数。它是如何优化的?

时间:2014-12-22 23:40:33

标签: javascript performance backbone.js

我正在阅读Backbone源代码,我遇到了triggerEvents函数,它在内部使用。该功能包括评论"难以置信但优化的内部调度功能'。我很好奇是否有任何对JavaScript内部机制有更多了解的人可以准确地解释这是什么方式进行优化。该功能以及评论:

// 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;
   }
};

1 个答案:

答案 0 :(得分:4)

Function.prototype.applyFunction.prototype.call基本相同,有一些逻辑将参数数组分解为单个参数。使用call显式而不是apply这种方式稍微更优化,因为如果超过3个参数,它只会通过额外的逻辑。

请参阅:ECMAScript 5 call vs apply spec

无论哪种方式,在ECMAScript 6中,两个函数都将具有尾调用优化,这基本上是“回收”。该函数而不是对同一函数进行额外调用。

ECMAScrip 6 call&amp; apply spec