避免JS冲突

最近一次的分享会中,学长提到了关于多人合作,如何避免js冲突的问题。当时并不是特别清楚何为JS冲突,因为平时做的基本都是一些小页面,页面的开发都是一个人完成的,所以并不会存在JS冲突的问题。于是,在空闲的时候,我就去查了一些资料,粗略的知道了何为避免JS冲突。全局变量的污染是引起JS冲突的一大杀手

A.匿名函数。使用匿名函数,即将脚本包起来,让变量的作用域控制在匿名函数之内

<script>
(function(){
var a = 1;
console.log(a); //1
})()
</script>
<script>

(function(){
var a = 2;
console.log(a); //2
})()
</script>

B.解决匿名函数之间的通信问题
匿名函数确实解决了冲突的问题,但如果两个代码段之间需要访问彼此的变量,那就被分隔开了,没法访问对方作用域中的变量
一个较好的解决方法是‘在window的作用域下定义一个全局变量’,但全局变量又是引起冲突的杀手。
为了控制全局变量的数量,用hash对象作为全局变量。
var GLOBAL = {}; //一个对象类型的变量作为全局变量,扩展性好
A中:GLOBAL.str1='aaa',在B中可以直接访问 var b = GLOBAL.str1;

function A(){
GLOBAL.str1='aaa';
}
function B(){
var b = GLOBAL.str1;
console.log(b); //aaa
}
A();
B();

但是当B中也定义了GLOBAL.str1='bbb'时,就会把A的str1覆盖掉。

function A(){
GLOBAL.str1='aaa';
}
function B(){
GLOBAL.str1='bbb';
console.log(GLOBAL.str1); //bbb
}
A();
B();

于是,我们可以给每个匿名函数声明不同的命名空间,然后每个匿名函数中GLOBAL对象的属性都不要直接挂在GLOBAL对象上,而是挂在此匿名函数的命名空间下,即GLOBAL.命名空间.属性变量
如:GLOBAL.A={} //定义命名空间
GLOBAL.A.str1='aaa'; //定义属性变量
GLOBAL.A={} //一级命名空间
GLOBAL.A.CAT={} //二级命名空间

<script>
var GLOBAL = {};
(function(){
GLOBAL.A={};
GLOBAL.A.str = 'a';
})();
</script>
<script>
(function(){
GLOBAL.B={};
GLOBAL.B.str = 'b';
console.log(GLOBAL.B.str); //b
})();
</script>

文章目录
|