【问题标题】:How can I create my own namespace for global variables in Meteor?如何在 Meteor 中为全局变量创建自己的命名空间?
【发布时间】:2015-02-07 21:57:07
【问题描述】:

我在理解一个我认为是全局变量的范围时遇到了困难。
我认为与其把它全部弄清楚,不如声明我自己的全局命名空间并将我的东西保存在那里。
是这样的吗?

客户端/main.js

MyNamespace = {};

客户端/some_other_file.js

MyNamespace.greeting = 'hello world';

【问题讨论】:

标签: meteor namespaces javascript-namespaces global-namespace


【解决方案1】:

是的,这是推荐的方法。使用像您的示例这样的命名空间可以为您带来两件事:

  • 它在逻辑上将变量分组到一个通用名称下。
  • 它最大限度地减少了附加到全局对象的变量总数。

您唯一需要注意的是加载顺序。将声明放在lib 或包中可能更有意义。

附注 - 这与 package export 提供的内容基本相同。

【讨论】:

    【解决方案2】:

    这更适合在 javascript(和 Meteor)中定义命名空间:

    MyNamespace = (typeof MyNamespace === 'undefined')? {} : MyNamespace;
    

    不幸的是,它是一个丑陋的怪物(语法上)。我希望命名空间很快会在 Javascript 中得到原生支持(可能与类和模块一起)。

    用法

    您可以将它放在文件的开头,而不是添加变量。例如:

    文件MyNamespace/greeting.js

    MyNamespace = (typeof MyNamespace === 'undefined')? {} : MyNamespace;
    
    MyNamespace.greeting = 'hello world';
    // ...
    

    文件MyNamespace/myFunction.js

    MyNamespace = (typeof MyNamespace === 'undefined')? {} : MyNamespace;
    
    MyNamespace.myFunction = function() {
      // ...
    }
    

    MyNamespace = {}; 有什么问题?

    关键是,如果您在多个文件上定义了命名空间(请注意,在像 Meteor 这样的环境中,如果您开始组织代码将其拆分为多个 js 文件,这很可能会发生)MyNamespace = {};最后加载的文件将覆盖之前的所有定义。

    例如:

    文件/client/controllers/HomeController

    Controllers = {}; // define namespace Controllers
    
    Controllers.HomeController = ...
       // ...
    

    文件/client/controllers/LoginController

    Controllers = {}; // define namespace Controllers
    
    Controllers.LoginController = ...
       // ...
    

    使用 Meteor,LoginController 将按字母顺序最后加载,指令 Controllers = {}; 清除将丢失的 HomeController 定义。

    上面的解决方案可以防止这种情况发生。

    【讨论】:

      猜你喜欢
      • 2012-03-13
      • 2014-02-17
      • 1970-01-01
      • 2011-03-25
      • 2021-06-16
      • 2011-08-31
      • 2017-01-04
      • 1970-01-01
      • 2015-04-22
      相关资源
      最近更新 更多