我正在玩骨干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();
答案 0 :(得分: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();
< / p>
定义了app
名称空间之外的任何其他名称,例如var router = new AppRouter( {})
作为局部变量,并且只能在它声明的函数范围内使用。它们是要使用的一次,它们不打算在代码中的任何其他地方使用(在当前范围之外)。
答案 1 :(得分:0)
我认为他基本上只附加了命名空间对象所需的内容。
因此,在这种情况下,TodoView是一个构造函数,每次添加待办事项时都需要创建一个新视图。虽然路由器构造函数仅用于创建单个路由器实例,但它仅在本地范围内创建并使用一次来创建app.TodoRouter。对于集合,构造函数使用一次来创建单实例app.Todos然后超出范围。如果您需要多个TodoList实例,则还需要将构造函数附加到app对象(app.TodoList)。
javascript中一个常见的命名约定是使用pascal case作为构造函数(大写第一个字母)和camel case作为实例。这将使它更具可读性,但这只是一个惯例,完全对意见持开放态度。在这种情况下,您将拥有app.TodoView和app.todoRouter。