这更适合在 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 定义。
上面的解决方案可以防止这种情况发生。