全局作用域下变量命名冲突
描述:在各自模块内都可以使用,一旦整合到一起发生冲突
|
|
解决方案: 立即执行函数表达式封装实现,让变量作用域控制在匿名函数之内。
|
|
匿名函数之间存在依赖
描述:C功能依赖于A功能的结果
解决方案:在window作用域下定义一个全局变量,把它作为一个桥梁,完成各匿名函数之间的通信
|
|
控制全局下变量数量的方法
描述:随着匿名函数之间需要通信的变量越多,需要的全局变量也就越多。因此需要严格控制全局变量的数量
|
|
解决方案:使用hash对象作为全局变量,可以将需要的变量都作为对象的属性,可以保证全局变量的个数足够少,同时拓展性非常好
|
|
hash键名发生冲突
描述:A,B,C,D四个模块分配给4个工程师实现4个功能,C依赖于A,并且使用A中的变量a,b,这个时候A中的变量a,b就需要通过挂载到全局对象GLOBAL上的属性实现A,C之间的通信,GLOBAL作为他们的桥梁。
但是新的需求是功能D需要和功能B通信,并使用功能B脚本中的变量a,开发功能D的是工程师丁。由于工程师丁只关心自己的匿名函数和功能B的匿名函数,使用GLOBAL.str却无意中覆盖了功能A中设置的同名变量,导致功能C出错。
解决方案:于是使用命名空间来解决这个问题,在不同的匿名函数下,根据功能声明一个不同的命名空间,然后每个匿名函数中的GLOBAL对象的属性都不要直接挂在GLOBAL对象上,而是挂在此匿名函数的命名空间下
|
|
如果同一个匿名函数中的程序非常复杂,变量名很多,命名空间还可以进一步拓展,生成二级命名空间
|
|
代码的冲突问题已经解决了,但可维护性并不强。比如,现在需要让工程师甲去修改功能B。因为工程师甲写的脚本是关于功能A的,他并不知道功能B的脚本情况。为了改善这种局面,需要给代码添加适当的注释。
|
|
让javascript不再冲突,需要
[1]避免全局变量的泛滥
[2]合理使用命名空间
[3]为代码添加必要的注释
本文转载自 如何避免javascript中的冲突
后话
模块化已经非常普及了,但是模块化解决的根本问题还是如何实现JS的私有空间,如何解决代码的依赖关系,如何避免发生冲突。