我正在阅读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;
}
};
答案 0 :(得分:4)
Function.prototype.apply
与Function.prototype.call
基本相同,有一些逻辑将参数数组分解为单个参数。使用call
显式而不是apply
这种方式稍微更优化,因为如果超过3个参数,它只会通过额外的逻辑。
请参阅:ECMAScript 5 call vs apply spec
无论哪种方式,在ECMAScript 6中,两个函数都将具有尾调用优化,这基本上是“回收”。该函数而不是对同一函数进行额外调用。