Backbone是一个优秀的前端MVC库,它的代码质量必定可靠。阅读过程中发现了函数triggerEvents有点意思,初看会以为一些代码是多余的。
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); } };
这段是Backbone.Events中的派发事件的核心函数。执行顺序大概是
- 把事件处理函数依次取出执行
- 根据第二个参数args的长度做分支处理
- args长度为3及以下时使用call,长度3以上时使用apply
如果把call的都去掉,直接使用apply,那么程序的逻辑正确性没有问题。如下
var triggerEvents = function(events, args) { var ev, i = -1, l = events.length; while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); };
代码还精简了。Backbone却加上了以上使用call这些代码,来看注释
// 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).
虽然难以相信,但却是为了性能考虑。多数Backbone内部方法触发事件时会传3个参数,即会使用call(而非apply)。
按此推理,call的性能较apply要高。搜关键字 "call apply performance", 貌似印证了这个说法
这是jsperf.com上的一个测试
从测试结果可以看出,多数浏览器中call的性能都好于apply,只有Safari5和Safari6中两者性能差不多。因此,Backbone是用冗余的代码换取了运行时的性能。
注:版本Backbone 1.0
相关:
http://jsperf.com/call-apply/3
what-is-the-difference-between-call-and-apply
why-are-call-and-apply-slower-than-a-direct-function-call-in-javascript
相关推荐
总结来说,"Faster R-CNN backbone - ResNet101.zip"是一个包含Faster R-CNN目标检测模型中ResNet101预训练权重的文件。这个文件可以用于构建和优化目标检测系统,特别是当目标检测任务需要处理大量的图像数据时,...
Faster R-CNN(快速区域卷积神经网络)是一种用于目标检测的深度学习模型,它在计算机...而"Faster R-CNN backbone - VGG16.ckpt"文件则是一个关键资源,它封装了模型的预训练知识,能够帮助用户快速进入实际应用阶段。
Pro Single Page Application Development - Using Backbone.Js and ASP.Net by Gil Fink and Ido Flatow.2014
"SPA-with-Backbone-master"可能是项目仓库的名字,其中的"master"分支通常代表项目的主分支,包含最新且稳定的代码。这暗示这个压缩包可能包含了一个完整的、用于创建SPA的Backbone.js示例项目,用户可以下载并按照...
标题 "Hysteresis-to-Backbone_gaussian_" 指示我们正在处理一个与计算或分析相关的程序或脚本,特别关注“hysteresis”(滞后效应)与“backbone”(基本结构),并且采用了高斯脉冲作为处理手段。在数学和信号处理...
但个体解接近最优解后改善缓慢,无法快速到达最优解,为此引入组合优化问题解的Backbone概念,在种群进入最优解域后固定解中的相同部分,从而保留解中包含的最优解的信息,在减小问题规模后继续进行优化,增强搜索...
在前端开发领域,Backbone.js 是一个非常受欢迎的JavaScript库,它为构建复杂的应用程序提供了一个轻量级的框架。Backbone.Validation 插件是针对Backbone.js设计的一个验证工具,用于帮助开发者轻松地实现对模型...
react-backbone, Backbone 感知mixin用于响应和更多 反应中枢为 Backbone 提供对你的的响应,以响应你的组件,。将 backbone/backbone 。集合感知awareness你的反应组件mixin用于更新模型更改事件,请注意xhr活动和...
awesome-backbone, backbone.js的资源列表 backbone.js backbone.js的资源列表常规backbone.jsGithub知识库注释源代码Backbone 插件插件Backbone 索引 - 发现新的Backbone 插件和资源Backbone
这个项目“前端项目-backbone-relational.zip”显然包含了使用Backbone-relational来管理复杂数据结构的代码实例。 Backbone.js 的核心特性包括模型(Model)、视图(View)、集合(Collection)和路由(Router)。...
vue-backbone Vue.js插件,可促进从Backbone的逐步迁移。 骨干集合和模型可以与Vue实例vue-backbone Vue.js插件安全集成,以促进从Backbone的逐步迁移。 骨干集合和模型可以安全地与Vue实例和组件集成在一起,并专注...
generator-backbone, 搭建 backbone.js 项目 backbone.js 发生器 提供功能样板 Backbone 应用程序的Backbone 生成器,可以从框中提供功能样板应用程序。 你还可以访问许多子生成器,可以轻松地创建单独的模型。视图...
【标题】"前端项目-backbone-pageable.zip" 涉及到的是一个基于Backbone.js框架的分页解决方案。Backbone.js是一款轻量级的JavaScript库,它为前端开发提供了模型(Model)、视图(View)、集合(Collection)以及...
在地震工程领域,滞回曲线和骨架曲线是分析结构抗震性能的重要工具。这些概念与MATLAB编程紧密相关,尤其在处理实验数据时。本资源包提供了MATLAB代码,旨在简化从抗震试验数据中提取滞回曲线及骨架曲线的过程,使得...
**标题解析:** ...总结来说,这个"前端项目-backbone.radio.zip"提供了学习和实践Backbone.Radio消息传递模式的机会,通过分析源码和理解项目结构,开发者可以更好地掌握前端应用中的组件通信策略。
在这个场景中,我们关注的是一个名为"前端项目-backbone-localstorage.js.zip"的压缩包,它包含了使用`Backbone.js`的一个扩展,即`Backbone.LocalStorage`,用于将数据存储在浏览器的本地存储(localStorage)中,...
backbone-boilerplate, 用于构建 Backbone 应用程序的工作流 Backbone 模板这个样板是许多研究和挫折的产物。 现有boilerplates自由修改 Backbone 核心,缺少构建过程,并且非常规范;Backbone 样板文件的变更。...
backbone-boilerplate, 一组用于构建 backbone.js 应用程序的最佳实践和实用工具 Backbone 模板这个样板是许多研究和挫折的产物。 现有的boilerplates修改 Backbone 核心,没有构建过程,或者者是非常规范的,这样的...
"前端项目-backbone.epoxy.zip" 这个标题暗示了这是一个关于前端开发的项目,其中使用了Backbone.Epoxy库。Backbone.Epoxy是基于Backbone.js的一个扩展,它提供了更方便的数据绑定机制,使得前端开发更加优雅和高效...
前端项目-backbone-react-component,backbone.react.component是react.component的一个包装,它将facebook的react的所有功能都带到backbone.js上。