如何在Meteor中为全局变量创建自己的命名空间?

时间:2014-12-09 20:51:32

标签: meteor namespaces javascript-namespaces global-namespace

我很难理解变量的范围,我认为该变量是全局变量 我认为也许最好是声明我自己的全局命名空间并将我的东西放在那里。 这是这样做的吗?

客户机/ main.js

MyNamespace = {};

客户机/ some_other_file.js

MyNamespace.greeting = 'hello world';

2 个答案:

答案 0 :(得分:2)

是的,这是推荐的方法。使用类似于您的示例的命名空间可以为您提供两件事:

  • 它以通用名称对变量进行逻辑分组。
  • 它最大限度地减少了附加到全局对象的变量总数。

您唯一需要注意的是加载订单。将声明置于lib或包中。

可能更有意义

旁注 - 这与package export给你的基本相同。

答案 1 :(得分:0)

这更适合在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文件,这很可能会发生){{1最后加载的文件将覆盖以前的所有定义。

例如:

档案MyNamespace = {};

/client/controllers/HomeController

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

/client/controllers/LoginController

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

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