0

我有一个关于 JavaScript 命名空间的问题。命名空间有什么好处?什么时候使用命名空间?使用全局变量是坏习惯吗?

4

4 回答 4

3

将所有变量存储在全局命名空间中是一种不好的做法,主要是因为您为名称冲突敞开了大门。例如,如果您定义了一个名为的函数Foo并导入了一个也定义了的 JavaScript 文件Foo,那么它们会发生冲突,并且在调用时最终会被隐藏。

命名空间的优点与其他语言类似:

  • 您可以对代码进行逻辑分组
  • 你可以将你的函数组织成更小的、可重用的块
  • 您可以避免名称冲突
  • 您避免弄乱全局命名空间(这会导致上述项目的反面)

我相信,无论何时开始编写 JavaScript,都应该避免将函数添加到全局命名空间中,并将代码保留在自己的命名空间中:

var MyLibrary = MyLibrary || {};
MyLibrary.x = function() { ... };

养成一个好习惯。

于 2013-04-22T17:08:02.910 回答
2
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 一样。

命名空间是一种非常有效的做法。你得到:

  1. 可读性(世界上最重要的事情!!)。
  2. 可维护性。
  3. 更快的调试。
  4. 更快的代码升级/代码交付。
  5. 延迟加载和缩小更容易,可以使用大量工具。
  6. 逻辑和功能的有效划分。
  7. 防止 IE 窗口与全局对象错误。
  8. 使团队工作变得可能和愉快。
  9. 大大加快了开发速度。大多数 IDE 会在您根据命名空间键入时索引和自动填充函数名称等。
  10. 您可以有效地使用 jsDoc 标签来记录您的 JavaScript 代码。
  11. 您可以避免与其他库发生冲突。
于 2013-04-22T17:09:33.123 回答
1

一般来说,命名空间的好处是:

  1. 限制全局范围的污染并防止命名冲突
  2. 为您的函数名称提供上下文(例如,我们期望 WindowUtils.getHeight 和 MenuUtils.getHeight 有不同的参数和结果)。

每当您构建任何显着规模或复杂性的项目时,您都可以使用命名空间。

全局变量通常是一个问题,因为它更容易命名不同文件之间的冲突和意外副作用。

于 2013-04-22T17:06:32.883 回答
1

如果可以避免使用全局变量总是不好的,因为它会使您无法控制的命名空间变得混乱。如果引入了一个新插件,或者第二个程序员在您的代码上工作,并且共享全局变量名,那么这可能会很糟糕,您将得到非常不受欢迎且难以跟踪的错误。

通过使用您自己的命名空间,您可以将您的函数和变量隔离到一个独特、安全的小茧中。:D

于 2013-04-22T17:06:48.440 回答