我有一个关于 JavaScript 命名空间的问题。命名空间有什么好处?什么时候使用命名空间?使用全局变量是坏习惯吗?
4 回答
将所有变量存储在全局命名空间中是一种不好的做法,主要是因为您为名称冲突敞开了大门。例如,如果您定义了一个名为的函数Foo
并导入了一个也定义了的 JavaScript 文件Foo
,那么它们会发生冲突,并且在调用时最终会被隐藏。
命名空间的优点与其他语言类似:
- 您可以对代码进行逻辑分组
- 你可以将你的函数组织成更小的、可重用的块
- 您可以避免名称冲突
- 您避免弄乱全局命名空间(这会导致上述项目的反面)
我相信,无论何时开始编写 JavaScript,都应该避免将函数添加到全局命名空间中,并将代码保留在自己的命名空间中:
var MyLibrary = MyLibrary || {};
MyLibrary.x = function() { ... };
养成一个好习惯。
var company = company || {} ;
company.doSomething = function() {
};
company.test = {};
company.test.submodule = {};
company.test.submodule.doSomething = function() {};
company.api = {};
company.api.submodule = {};
您通常应该避免全局定义变量。对于清晰可维护的代码,使用对象作为命名空间,避免污染全局命名空间。
这也极大地增强了默认的 JS 功能。如果你真的很喜欢它,在你的项目中添加类似 require.js 的东西,你会得到一个非常好的类似 Java 的功能。
因此,使用 require.js,您的 company.api 和 company.test 可以放在不同的文件中并相互要求,就像您使用 Java 包执行 import company.test 一样。
命名空间是一种非常有效的做法。你得到:
- 可读性(世界上最重要的事情!!)。
- 可维护性。
- 更快的调试。
- 更快的代码升级/代码交付。
- 延迟加载和缩小更容易,可以使用大量工具。
- 逻辑和功能的有效划分。
- 防止 IE 窗口与全局对象错误。
- 使团队工作变得可能和愉快。
- 大大加快了开发速度。大多数 IDE 会在您根据命名空间键入时索引和自动填充函数名称等。
- 您可以有效地使用 jsDoc 标签来记录您的 JavaScript 代码。
- 您可以避免与其他库发生冲突。
一般来说,命名空间的好处是:
- 限制全局范围的污染并防止命名冲突
- 为您的函数名称提供上下文(例如,我们期望 WindowUtils.getHeight 和 MenuUtils.getHeight 有不同的参数和结果)。
每当您构建任何显着规模或复杂性的项目时,您都可以使用命名空间。
全局变量通常是一个问题,因为它更容易命名不同文件之间的冲突和意外副作用。
如果可以避免使用全局变量总是不好的,因为它会使您无法控制的命名空间变得混乱。如果引入了一个新插件,或者第二个程序员在您的代码上工作,并且共享全局变量名,那么这可能会很糟糕,您将得到非常不受欢迎且难以跟踪的错误。
通过使用您自己的命名空间,您可以将您的函数和变量隔离到一个独特、安全的小茧中。:D