0

我正在玩 Todo MVC 应用程序的主干http://addyosmani.github.com/todomvc/并注意到一些东西,我不确定这是设计完成的(这是必要的)或者它只是随机的。作者似乎对 Backbone 和 js 颇有经验,在声明 Router (var Workspace) 和 Collection (var TodoList) 时使用 'var',然后在实例化时将它们带入 app 命名空间,例如,

app.TodoRouter = new Workspace();

但是,例如,当他声明视图时,他不使用 var,而是直接使用命名空间。他也对模型执行此操作。例如,

app.TodoView = Backbone.View.extend({

});

无需检查所有代码,是否存在我遗漏的决定的更高层次的原因,或者它只是任意的

代码

看法

app.TodoView = Backbone.View.extend({

});

路由器

var Workspace = Backbone.Router.extend({

});

app.TodoRouter = new Workspace();

收藏

var TodoList = Backbone.Collection.extend({

});

// Create our global collection of **Todos**.
app.Todos = new TodoList();
4

2 回答 2

1

该代码使用命名空间,他将其app用作与全局命名空间相关联的唯一变量。大多数时候,你会看到一些东西:

var app = {};  /** local */
window.app = app;  /** assign variable to global scope */

app现在您可以在其中定义变量,并且您在其中定义的任何内容都可以在app命名空间内的任何位置访问。

所以现在,你可以定义各种子命名空间来保持你的代码整洁并且更容易找到东西。最有可能出于组织目的,避免变量冲突并且不要混淆变量。你可以做这样的事情,它为整个应用程序提供结构。

app = {
    Utilities: {},
    Views: {},
    Collections: {}
};

您也可以随时在其中定义变量,例如。

app.Models = {};

variables现在它们不是在window(或全局命名空间)中到处都是,而是在 中定义,并且app可以通过以下方式访问app.Utilities.doSomething();

在该命名空间之外定义的任何其他内容(app例如var router = new AppRouter( {})局部变量)都已定义,并且只能在声明它的函数的范围内使用。它们只能使用一次,并且不能在其他任何地方使用代码(当前范围之外)。

于 2013-01-26T04:23:45.353 回答
0

我相信他本质上只是将需要的东西附加到命名空间对象。

所以在这种情况下,TodoView 是一个构造函数,每次添加一个 todo 项时都需要它来创建一个新视图。而路由器构造函数只用于创建一个单独的路由器实例,所以它只在本地范围内创建,并且使用一次来创建app.TodoRouter。集合也是如此,构造函数被使用一次来创建单实例 app.Todos,然后超出范围。如果在需要多个 TodoList 实例的情况下,您还需要将构造函数附加到应用程序对象 (app.TodoList)。

javascript 中一个常见的命名约定是对构造函数使用 pascal 大小写(首字母大写),对实例使用驼峰式大小写。这会使它更具可读性,但这只是一个约定,完全可以接受意见。在这种情况下,您将拥有 app.TodoView 和 app.todoRouter。

于 2013-01-26T04:30:23.047 回答