Javascript我应该采用哪些其他技巧而不是导出符号

时间:2012-06-15 11:47:04

标签: javascript architecture backbone.js underscore.js

Google Closure库提供导出符号选项,以通过窗口对象提供对构造函数的访问。

例如:导出任务将允许执行window.task

但是这与Google闭包库完全不同。我正在使用Backbone.js构建一个任务应用程序。我的视图,模型,路由器和拆分在许多文件中,我按照上面的过程分配实例,源到窗口对象,以便一个人可以访问另一个。

  • 如何通过窗口访问单个应用程序的模型,视图和路由器?你有什么技巧,技巧使它们成为一种沙盒

2 个答案:

答案 0 :(得分:2)

您几乎总是必须在窗口中至少暴露一件事。

但是,您可以使用命名空间来帮助解决。

// app.js
var App = App || {};
App.Views = App.Views || {};
App.Models = App.Models || {};

App.Views.HomeView = Backbone.View.extend({});
App.Model.User = Backbone.Model.extend({});

唯一不一定是你使用requireJS的情况。

// app.js
define(['views/home'], function (home) {
    var home = new home({
        el: '#home'
    });
});
// views/home.js
define(['backbone'], function (Backbone) {
    var home = Backbone.View.extend({});
    return home;        
});

虽然,我想如果你真的想要,你可以在自我执行功能中做所有事情。

(function ($, Backbone) {
    // Do your stuff here instead?.
    // Just keep in mind, nothing you do in here will be available outside.
    var home = Backbone.View.extend({});
    new home(); // Works...
}(jQuery, Backbone);
new home(); // FAIL!

唯一的问题是你在函数内部所做的任何事情都不可用于它之外。

如果您对任何实施有任何疑问,请与我们联系。

答案 1 :(得分:1)

无论您使用什么 - 全局范围(浏览器中的“窗口”)或其他用于保存命名空间的对象,总会有碰撞的机会。使用其他东西只会让你不再需要注意默认属性窗口已有的内容。

任何模块的最佳实践是将外部视图(通过窗口或其他)仅暴露给单个对象,并将其他所有内容作为属性,因为这样可以将冲突的可能性降低到绝对最小值。