如何在 Meteor 中为全局变量创建自己的命名空间?
Posted
技术标签:
【中文标题】如何在 Meteor 中为全局变量创建自己的命名空间?【英文标题】:How can I create my own namespace for global variables in Meteor? 【发布时间】:2015-02-07 21:57:07 【问题描述】:我在理解一个我认为是全局变量的范围时遇到了困难。 我认为与其把它全部弄清楚,不如声明我自己的全局命名空间并将我的东西保存在那里。 是这样的吗?
客户端/main.js
MyNamespace = ;
客户端/some_other_file.js
MyNamespace.greeting = 'hello world';
【问题讨论】:
How can I access constants in the lib/constants.js file in Meteor?的可能重复 【参考方案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
定义。
上面的解决方案可以防止这种情况发生。
【讨论】:
以上是关于如何在 Meteor 中为全局变量创建自己的命名空间?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Microsoft MakeCode 中为 micro:bit 创建全局变量?