Js命名冲突
1)如何避免JS沖突
A:匿名函數(shù)
在多人合作一個(gè)網(wǎng)站時(shí),每個(gè)人都會(huì)寫(xiě)自己的JS代碼,定義變量的時(shí)候有可能會(huì)引起命名沖突,如何避免這種沖突隱患呢?
一種最簡(jiǎn)單有效的辦法是“匿名函數(shù)”將腳本包起來(lái),讓變量的作用域控制在匿名函數(shù)之內(nèi)。
匿名函數(shù):(function (){})() 前面的括號(hào)內(nèi)是函數(shù)體,后面的()表示執(zhí)行。
如:(function(){
var name,user="test"; //包含在這個(gè)匿名函數(shù)中的變量,作用域不再是window,而是局限在函數(shù)內(nèi)部。因?yàn)楦髯园诓煌哪涿瘮?shù)內(nèi),也就不再互相沖突了。
})();
用匿名函數(shù)將腳本包起來(lái),可以有效的控制全局變量,避免沖突隱患。
B:解決匿名函數(shù)之間的通信問(wèn)題
上面的匿名函數(shù)確實(shí)解決了沖突,但是如果兩個(gè)代碼段之間需要訪問(wèn)彼此的變量,那就被分隔開(kāi)了,沒(méi)法訪問(wèn)對(duì)方作用域中的變量.
一個(gè)比較好的解決辦法是"在window的作用域下定義一個(gè)全局變量",但是從上面的沖突來(lái)看,全局變量是引起沖突的殺手,如果又這樣定義,就違背了我們使用匿名函數(shù)的初衷,所以應(yīng)該嚴(yán)格控制全局變量的數(shù)量!
為了控制全局變量的數(shù)量,用Hash對(duì)象作為全局變量。 var GLOBAl={}; //一個(gè)對(duì)象類型的變量作為全局變量,擴(kuò)展性好
定義好對(duì)象類型變量后,在匿名函數(shù)A中定義GLOBAL的屬性:GLOBAL.str1="aaa"; 在匿名函數(shù)B中可以直接訪問(wèn)var b = BLOBAl.str1;
這樣又出現(xiàn)了一個(gè)問(wèn)題,當(dāng)在匿名函數(shù)B中它也定義一個(gè)屬性BLOBAl.str1="bbb"; 這個(gè)時(shí)候就會(huì)把A塊中的屬性str1給覆蓋掉.如何避免這種沖突呢?不可能每個(gè)開(kāi)發(fā)者在使用GLOBAL對(duì)象之前,都要查找一下綁定了哪些屬性。
這時(shí),命名空間就出現(xiàn)了,它是一種特殊的前綴,在js中它其實(shí)是通過(guò)一個(gè){}對(duì)象來(lái)實(shí)現(xiàn)的。我們可以給每個(gè)匿名函數(shù)聲明不同的命名空間,然后每個(gè)匿名函數(shù)中GLOBAL對(duì)象的屬性都不要直接掛在GLOBAl對(duì)象上,而是掛在此匿名函數(shù)的命名空間下,既:window全局的GLOBAL.命名空間.屬性變量 ,這樣申明屬性名稱的時(shí)候,即使同名,空間不一樣也不會(huì)引起沖突。如: GLOBAL.A={};// 定義命名空間; GLOBAL.A.str1="aaa";//定義屬性變量
復(fù)雜的匿名函數(shù)中,你還可以生產(chǎn)二級(jí)命名空間,如GLOBAL.A={};//一級(jí)命名空間,GLOBAL.A.CAT={};GLOBAL.A.DOG={};//二級(jí)命名空間;
生成命名空間是一個(gè)很常用的功能,可以將其封裝為一個(gè)函數(shù)。
var GLOBAL={};
GLOBAL.namespace=function(str){
var arr=str.split("."),o=GLOBAL;
for(i=(arr[0]=="GLOBAL")?1:0; i<arr.length; i++) {
o[arr[i]]=o[arr[i]] || {};
o=o[arr[i]];
}
}
調(diào)用: GLOBAL.namespace('A.DOG'); GLOBAL.namespace('GLOBAL.B');
總結(jié):解決js沖突-------全局變量+命名空間+匿名函數(shù)很好的結(jié)合使用才能更好的解決沖突。
C:注釋
添加必要的代碼注釋,可大大提高可維護(hù)性,對(duì)團(tuán)隊(duì)合作來(lái)說(shuō),是很重要的。
注釋添加的信息包括:功能說(shuō)明;工程師姓名;工程師聯(lián)系方式;代碼最后修改時(shí)間;
讓JS不產(chǎn)生沖突,需要避免全局變量的泛濫,合理使用命名空間,以及給代碼添加注釋。
轉(zhuǎn)載于:https://www.cnblogs.com/xinyeblog/p/5462428.html
總結(jié)
- 上一篇: 购买新车需要考虑哪些因素?
- 下一篇: c1证能开什么车?