0

我正在阅读 Backbone.js 源代码,对此感到困惑

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()?

这种结构意味着,如果有机会出于速度的考虑始终使用 call 而不是 apply,因为该函数的结构似乎在说“如果我知道有多少个 args 则使用 call,而不是使用 apply”,当一个人可以一直使用 apply 时。

简而言之,我不确定这个函数的目的是什么,以及为什么按照它的编写方式编写它,如果有人能告诉我它会很棒!

4

1 回答 1

3

我创建了一个小型JSPerf 测试套件,用于比较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另一方面,属性是作为上下文绑定到回调函数的对象thisBackbone.Events.on将上下文作为可选参数。在上面的示例中,最后一个参数this指定回调函数的上下文应该是包含类。

于 2013-02-19T22:24:51.130 回答