Javascript中的命名空间

时间:2013-04-22 17:03:23

标签: javascript

我对JavaScript的命名空间有疑问。命名空间的优点是什么?我什么时候才能使用命名空间?使用全局变量是不好习惯吗?

4 个答案:

答案 0 :(得分:3)

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

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

  • 您可以对代码进行逻辑分组
  • 您可以将功能组织成较小的,可重复使用的块
  • 你可以避免姓名冲突
  • 你可以避免使全局命名空间混乱(导致上述项目的反对)

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

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

这是一个很好的习惯。

答案 1 :(得分: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包一样导入company.test。

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

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

答案 2 :(得分:1)

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

  1. 限制全球范围内的污染并防止命名冲突
  2. 为您的函数名提供上下文(例如,我们期望WindowUtils.getHeight和MenuUtils.getHeight使用不同的参数和结果。)
  3. 无论何时构建任何大小或复杂的项目,都可以使用命名空间。

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

答案 3 :(得分:1)

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

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