【问题标题】:Javascript What other tricks should i employ instead of exporting symbolsJavascript 我应该使用哪些其他技巧而不是导出符号
【发布时间】:2012-06-15 20:14:37
【问题描述】:

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

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

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

  • 如何不通过窗口访问单个应用程序的模型、视图、路由器?您使用了哪些技巧和技巧来使它们成为沙盒式的

【问题讨论】:

    标签: javascript architecture backbone.js underscore.js


    【解决方案1】:

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

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

    // 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!
    

    唯一的问题是你在函数内部所做的任何事情都不能在函数外部使用。

    如果您对任何实现有任何疑问,请告诉我。

    【讨论】:

      【解决方案2】:

      无论您使用什么 - 全局范围(也称为浏览器中的“窗口”)或其他一些对象来保存您的命名空间,总会有发生冲突的机会。使用其他东西只会让您不必担心默认属性窗口已经拥有什么。

      任何模块的最佳做法是仅将单个对象(通过窗口或其他)暴露给外部视图,并将其他所有内容作为其属性,因为这样可以将碰撞的可能性降至最低。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-13
        • 2010-12-04
        • 2011-12-27
        • 2011-09-11
        • 2012-02-19
        • 2021-03-18
        • 1970-01-01
        相关资源
        最近更新 更多