如何解决'test'的重复变量定义或者这不是问题?
由于JavaScript的提升,这不是问题。变量“悬挂”到第一次使用的位置。除非你为它设置了一个新的值,否则它不会被重新定义。
的命名空间模式可以这样写:
(function (namespace) {
...
}(window.namespace = window.namespace || {}));
// or similarly
(function (namespace) {
...
}(window.namespace || (window.namespace = {})));
换句话说:“声明功能,并立即调用它,传递对象;如果该对象尚未初始化,创建新的对象从头开始并使用它,否则继续从同一个对象构建。“
打字稿正在产生基本上等同的代码,只是没有明确提到窗口对象:
var namespace; // same as window.namespace but does not assume window exists or what it is
(function (namespace) {
...
}(namespace || (namespace = {})));
其实,这也将使得生成的代码不一定住在全局命名空间。 var namespace;
与全局名称空间中的window.namespace
相同,但不在其他某个范围内。例如,如果您的名称空间嵌套在另一个名称空间中,则第二个名称空间将使用相同的模式,并且该变量不会隐式附加到window
,而是位于外部名称空间对象的作用域中。例如:
var outerNamespace; // same as window.outerNamespace
(function (outerNamespace) {
var innerNamespace; // not the same as window.innerNamespace
(function (innerNamespace) {
...
}(outerNamespace.innerNamespace || (outerNamespace.innerNamespace = {})));
}(outerNamespace || (outerNamespace = {})));
...
var outerNamespace; // doesn't matter because of JS variable hoisting
(function (outerNamespace) {
...
}(outerNamespace || (outerNamespace = {})));
嗨 - 如果我删除的模块定义我得到全局命名空间污染,因为每类成为一个全局变量.... –
没有这样的东西“全局命名空间”。主要的是你的程序的模块化结构基本上是由它的文件/文件夹结构来定义的。你将你的'类似'类放在同一个文件夹中。并且要使用模块,只需通过“导入”语句导入需要的类(或全部使用*)。请记住,每个文件只有一个类别并不是什么坏主意。 – Amid
我不敢相信这是一个很好的习惯去除模块定义,并且只是有很多全局变量,比如var Blah,var Blah2 ....每一个类都变成了一个看起来不错的变量。这可能适用于小应用程序,但不适用于较大的应用程序... –