【问题标题】:Backbone triggerEvents骨干触发事件
【发布时间】:2015-07-14 06:52:00
【问题描述】:

我正在阅读事件模块的 Backbone.js 源代码,这段代码让我感到困惑:

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

我想知道我们为什么要确定args.length?为什么不这样写:

var triggerEvents = function(events, args) {
    var ev, i = -1,
    while (++i < l)(ev = events[i]).callback.apply(ev.ctx, args);

};

所以主要问题是:我们为什么要确定args.length?为什么不只用一个while (++i &lt; l)(ev = events[i]).callback.apply(ev.ctx, args); 替换所有call

【问题讨论】:

    标签: javascript jquery backbone.js


    【解决方案1】:

    这是我的“有根据的猜测”(不知道 Backbone 内部结构) 似乎每个event 都有一个回调属性,这是在触发event 时要调用的函数。比如click

    这个回调函数可以接受不同数量的参数。参数数量未知。这就是args.length 发挥作用的地方。当您仅传递单个参数时,它将使用该单个参数调用回调函数。如果你用 2 调用它,它将传递 2 个参数,等等......

    之所以有callback.call()callback.apply() 是因为.call() 将参数“一个接一个”地传递给被调用的函数,而.apply() 将所有参数作为单个数组传递。

    .call().apply()之间的区别很好的解释可以在这篇文章http://hangar.runway7.net/javascript/difference-call-apply中找到

    PS:如果我对 Backbone 的猜测是错误的,请纠正我 :)

    更新

    源代码https://gist.github.com/badsyntax/4663217 中有注释,就在triggerEvents 声明的上方。所以这就是你的答案。你可以尝试找一些性能测试:)

       // Optimized internal dispatch function for triggering events. Tries to
       // keep the usual cases speedy (most Backbone events have 3 arguments).
    

    更新 2

    这个优化的原因是.call()可以比.apply()快,因为.apply()需要构造数组作为参数。 (并且调用 .call() 和 .apply 几乎总是比调用原始方法慢,仅仅是因为还有一个操作要执行)

    【讨论】:

    • 是的,.call().apply() 接收参数的方式不同,但是args 已经是一个数组,所以我认为在这种情况下只使用一个.apply() 就可以实现同样的效果,换句话说,确定args.length.call() 没有任何意义,我猜可能是多余的。
    • @huachengzan 也许你是对的……你能测试一下并提供结果链接吗?
    • @huachengzan 这是解释优化的答案stackoverflow.com/questions/8184466/…
    • 这是一个很大的帮助,我想我需要这个,再次感谢!
    猜你喜欢
    • 2013-01-22
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多