我很难理解变量的范围,我认为该变量是全局变量 我认为也许最好是声明我自己的全局命名空间并将我的东西放在那里。 这是这样做的吗?
客户机/ main.js
MyNamespace = {};
客户机/ some_other_file.js
MyNamespace.greeting = 'hello world';
答案 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 = {};
定义。
上述解决方案可以防止这种情况发生。