2013-04-22 91 views
0

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

+0

隔离,当你想要隔离的东西,通常是:) – 2013-04-22 17:05:02

+0

重复http://stackoverflow.com/questions/4246284/why-are-globals-bad – 2013-04-22 17:08:05

回答

3

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

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

  • 则可以顺理成章地组代码
  • 你可以组织功能集成到更小的,可重复使用的块
  • 你能避免名称冲突
  • 您可以避免混淆全局命名空间(导致上述项反)

我相信你开始编写JavaScript,任何时候,你应该避免将您的功能全局命名空间,并保持你的代码在自己的名称空间:

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

这是一个好习惯进入。

+1

的虽然大家都知道正确的答案,这,我认为你的答案是最清晰和最简洁的。 +1 – BBagi 2013-04-22 17:08:52

+0

@BBagi谢谢! – 2013-04-22 17:10:10

1

一般命名空间的好处是:

  1. 限制全球范围内的污染和防止命名冲突
  2. 提供上下文的函数名(我们预计为WindowUtils.getHeight不同的参数和结果和例如MenuUtils.getHeight)。

无论何时您构建任何重要大小或复杂度的项目,您都可以使用命名空间。

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

1

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

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

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.test一样。

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

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

更快的升级?这是一个很好的列表,但我没有得到那个 – 2013-04-22 17:19:08