使用和不使用命名空间声明

时间:2013-01-26 01:50:57

标签: backbone.js

我正在玩骨干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();

2 个答案:

答案 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。