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
相关推荐
Pro Single Page Application Development - Using Backbone.Js and ASP.Net by Gil Fink and Ido Flatow.2014
但个体解接近最优解后改善缓慢,无法快速到达最优解,为此引入组合优化问题解的Backbone概念,在种群进入最优解域后固定解中的相同部分,从而保留解中包含的最优解的信息,在减小问题规模后继续进行优化,增强搜索...
SPA-with-Backbone, Backbone.jsでsingle pageアプリケーションを作る方法
react-backbone, Backbone 感知mixin用于响应和更多 反应中枢为 Backbone 提供对你的的响应,以响应你的组件,。将 backbone/backbone 。集合感知awareness你的反应组件mixin用于更新模型更改事件,请注意xhr活动和...
Faster R-CNN 的基础网络,ckpt 文件
awesome-backbone, backbone.js的资源列表 backbone.js backbone.js的资源列表常规backbone.jsGithub知识库注释源代码Backbone 插件插件Backbone 索引 - 发现新的Backbone 插件和资源Backbone
前端项目-backbone.validation,主干.js的一个验证插件,用于验证模型和表单输入。
generator-backbone, 搭建 backbone.js 项目 backbone.js 发生器 提供功能样板 Backbone 应用程序的Backbone 生成器,可以从框中提供功能样板应用程序。 你还可以访问许多子生成器,可以轻松地创建单独的模型。视图...
Faster R-CNN 的基础网络,ckpt 文件
前端项目-backbone-relational,获取和设置主干模型的关系(一对一、一对多、多对一)
前端项目-backbone-pageable,可分页主干。集合超集。支持服务器端/客户端/无限分页和排序。
vue-backbone Vue.js插件,可促进从Backbone的逐步迁移。 骨干集合和模型可以与Vue实例vue-backbone Vue.js插件安全集成,以促进从Backbone的逐步迁移。 骨干集合和模型可以安全地与Vue实例和组件集成在一起,并专注...
backbone-boilerplate, 用于构建 Backbone 应用程序的工作流 Backbone 模板这个样板是许多研究和挫折的产物。 现有boilerplates自由修改 Backbone 核心,缺少构建过程,并且非常规范;Backbone 样板文件的变更。...
backbone-boilerplate, 一组用于构建 backbone.js 应用程序的最佳实践和实用工具 Backbone 模板这个样板是许多研究和挫折的产物。 现有的boilerplates修改 Backbone 核心,没有构建过程,或者者是非常规范的,这样的...
前端开源库-backbone-callbacks主干回调,主干.js异步方法的匿名回调风格接口
前端项目-backbone-react-component,backbone.react.component是react.component的一个包装,它将facebook的react的所有功能都带到backbone.js上。
#drbx-js-backbone 一个drbx.js主干插件,以同步到Dropbox #如何从npm使用安装 npm i drbx-js-backbone 并要求这样 var Backbone = require('drbx-js-backbone); ##用法示例#### init,带有弹出驱动程序和登录...
前端项目-backbone.radio,主干应用程序的消息传递模式。
前端项目-backbone-localstorage.js,用基于本地存储的持久性替换backbon.sync的简单模块。模型被赋予guid,并保存到JSON对象中。就这么简单。
directory-backbone-ratchet, 使用 backbone.js 和棘轮构建的移动/phonegap应用示例 员工目录使用 backbone.js 和棘轮 2.0构建的示例应用程序"Backbone 目录"是用 backbone.js 和 [Ratchet] ( ...构建的简单员