我在理解一个我认为是全局的变量的范围时遇到了困难。
与其把它全部弄清楚,我想也许最好声明我自己的全局命名空间并将我的东西放在那里。
这是这样做的方法吗?
客户端/main.js
MyNamespace = {};
客户端/some_other_file.js
MyNamespace.greeting = 'hello world';
我在理解一个我认为是全局的变量的范围时遇到了困难。
与其把它全部弄清楚,我想也许最好声明我自己的全局命名空间并将我的东西放在那里。
这是这样做的方法吗?
客户端/main.js
MyNamespace = {};
客户端/some_other_file.js
MyNamespace.greeting = 'hello world';
是的,这是推荐的方法。使用像你的例子这样的命名空间会给你两件事:
您唯一需要注意的是加载顺序。lib
将声明放在包下或包中可能更有意义。
旁注 - 这本质上与包导出给你的东西是一样的。
这对于在 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 = {};
将要加载的文件for last 将覆盖以前的所有定义。
例如:
文件/client/controllers/HomeController
:
Controllers = {}; // define namespace Controllers
Controllers.HomeController = ...
// ...
文件/client/controllers/LoginController
:
Controllers = {}; // define namespace Controllers
Controllers.LoginController = ...
// ...
使用 Meteor,LoginController
将按字母顺序最后加载,并且指令Controllers = {};
清除HomeController
将丢失的定义。
上面的解决方案将防止这种情况发生。