我对JavaScript的命名空间有个疑问。命名空间的优点是什么?我什么时候可以使用命名空间?使用全局变量是不好的习惯吗?Javascript中的命名空间
回答
将所有变量存储在全局名称空间中是一种不好的做法,主要是因为您打开了名称冲突。例如,如果您定义了一个名为Foo
的函数,并且您导入了一个也定义了Foo
的JavaScript文件,则它们将发生冲突,并在调用时最终隐藏。
命名空间的优点类似于其他语言:
- 则可以顺理成章地组代码
- 你可以组织功能集成到更小的,可重复使用的块
- 你能避免名称冲突
- 您可以避免混淆全局命名空间(导致上述项反)
我相信你开始编写JavaScript,任何时候,你应该避免将您的功能全局命名空间,并保持你的代码在自己的名称空间:
var MyLibrary = MyLibrary || {};
MyLibrary.x = function() { ... };
这是一个好习惯进入。
的虽然大家都知道正确的答案,这,我认为你的答案是最清晰和最简洁的。 +1 – BBagi 2013-04-22 17:08:52
@BBagi谢谢! – 2013-04-22 17:10:10
一般命名空间的好处是:
- 限制全球范围内的污染和防止命名冲突
- 提供上下文的函数名(我们预计为WindowUtils.getHeight不同的参数和结果和例如MenuUtils.getHeight)。
无论何时您构建任何重要大小或复杂度的项目,您都可以使用命名空间。
全局通常是一个问题,因为它更容易命名不同文件之间的冲突和意外副作用。
如果可以避免使用全局变量总是不好的,因为它会混淆无法控制的名称空间。如果引入了新的插件,或者第二个程序员在您的代码上工作,并且全局变量名称被共享,那么这可能很糟糕,您将会遇到非常不受欢迎且难以追踪的错误。
通过使用你自己的命名空间,你可以将你的函数和变量分隔成一个独特的,安全的小茧。 :D
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一样。
命名空间是一种非常有效的做法。你得到:
- 可读性(世界上最重要的!!)。
- 可维护性。
- 更快的调试。
- 更快的代码升级/代码交付。
- 延迟加载和缩小比较容易,可以使用大量工具。
- 逻辑和功能的高效划分。
- 防止IE窗口与全局对象错误。
- 使团队中的工作可能和愉快。
- 加快发展很多。大多数IDE将根据您的命名空间进行键入时索引和自动填充函数名称等。
- 你可以有效地使用jsDoc标签来记录你的JavaScript代码。
- 您可以避免与其他库的冲突。
更快的升级?这是一个很好的列表,但我没有得到那个 – 2013-04-22 17:19:08
- 1. Javascript命名空间
- 2. 的Javascript:命名空间
- 3. 继承命名空间javascript
- 4. JavaScript多个命名空间
- 5. 多个javascript命名空间?
- 6. Javascript命名空间冲突
- 7. Javascript和jquery命名空间
- 8. 使用javascript命名空间
- 9. Javascript/AngularJS中的命名空间事件?
- 10. JavaScript:在命名空间内遍历/浏览命名空间?
- 11. 从匿名命名空间调用命名命名空间中的函数
- 12. 命名空间中不存在命名空间名称'Notify'Twilio.Rest
- 13. 命名空间路线中的未命名空间路线
- 14. JavaScript的命名空间声明
- 15. 结合JavaScript的onload命名空间
- 16. 的Javascript包括命名空间
- 17. 带jQuery的JavaScript命名空间
- 18. 的Javascript命名空间污染问题
- 19. 关于javascript命名空间的问题
- 20. JavaScript的命名空间字符串
- 21. JavaScript的命名空间架构
- 22. 重命名命名空间
- 23. C#中的命名空间#
- 24. 命名空间中的类
- 25. XSLT中的命名空间
- 26. c中的命名空间#
- 27. XSLT中的命名空间
- 28. c中的命名空间#
- 29. Redis中的命名空间?
- 30. 命名空间中的XML
隔离,当你想要隔离的东西,通常是:) – 2013-04-22 17:05:02
重复http://stackoverflow.com/questions/4246284/why-are-globals-bad – 2013-04-22 17:08:05