2013-02-19 52 views
0

我通过Backbone.js的源读取和我这个骨干triggerEvents变量

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()是什么?

这种结构意味着,如果给每个人都应该使用的呼叫,而不是在速度上的利益提出申请,因为该功能的结构的机会,似乎在说:“如果我知道有多少ARGS有使用电话,相反,使用应用“,当一个人可以使用一路通过。

总之,我不确定这个函数的目的是什么,为什么它被写入了它的写法,如果有人能告诉我这将是伟大的!

回答

3

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

+0

谢谢 - 这真的有帮助=) – praks5432 2013-02-19 22:51:40