一个项目可能由多个工程师完成,一个人可能需要完成多个JS文件。
在这个情况下,如何避免命名冲突呢?这个时候我们需要对全局变量进行控制,进行切忌全局变量使用泛滥。
方法1:使用匿名函数将包含脚本。让变量的作用域控制在匿名函数里面。
(function(){
var a=1;
var b=2;
})()
a,b都是包在这个匿名函数function里的变量,作用域不再是window,而是局限在函数内部。
由于变量被各自包含在不同的匿名函数中,也就不会出现冲突了。
但是不同脚本里的变量就不能互相通信。处理方式:在window中定义一个全局变量,如下:
var str;
(function(){
var str=a=2;
})()
(function(){
alert(str);
})():
上面的例子中,使用普通的变量作为全局变量会导致扩展性差。
方法2:使用一个对象类型的变量作为全局变量。
var Globle{};
(function(){
Globle.str2=a;
Globle.str1=b;
})()
(function(){
Globle.str2=a;
Globle.str3=b;
})()
我们看到上面,虽然用一个Globle变量,但是有可能出现两个方法中都绑定同一个属性str2,导致变量被替换。
方法3:使用命名空间+对象型全局变量
在不同的命名空间下,使用相同的对象类型变量来存放全局变量
(function(){
Globle.A={};
Globle.A.str=1;
})()
(funciton(){
Globle.B={};//一级命名空间 Globle.B.B={}是二级命名空间
Globle.B.str=2;
})()
方法3升级版:定义命名空间函数,在需要使用命名空间的匿名函数中调用
var Globle={};
Globle.namespace=function(str){
var arr=str.split("."),
o=Globle;
if(arr[0]="Globle") var i=1;
else var i=0;
for(i;i<arr.length;i++){
o[ arr[i] ] = o[ arr[i] ] || {};//当o[ arr[i] ]存在时就等于o[ arr[i] ],不存在,即最后一个的时候就等于空对象{}
o=o.[ arr[i] ]
}
}
理解:
str=Globle.A.ar;
arr=[Globle,A,ar];
o=Globle;
o[A]=o[A];
o=Globle=Globle[A]=Globle.A;
Globle[A][ar]=Globle[A][ar]=Globle.A.ar;
str=A.ar;
arr=[A,ar];
o=Globle;
o[arr[0]]=o[A];o[A]=o[A];
o[ar]=o[ar];
o=Globle[A][ar]=Globle.A.ar;
在其他地方的调用:
Globe.namespace("A.str");
Globle.namespace("B.str");