javascript 全局变量的污染问题

  最近闲来无事,开始研究起JavaScript来了(主要是自己的js功底太过于薄弱)于是在网上找了很多资料学习。有一次在一篇文章里面看到了一个“全局变量污染“的“新词汇”(作为菜鸟的我向毛爷爷保证本人之前从没有听过这个词),觉得挺新奇的于是今天过来说说。

    全局变量 —— 在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。

上面的描述说的是在函数或者对象的外部定义的变量就是全局变量,全局变量都是挂载在window这个js最大的对象下面的。如果我们要访问它有三种方式:

js代码

    var name = zhangshan;

  function test(){

   age = 20;

  }

1,直接访问: name 或者 test();

2,window["name"] 或者 window["test"]();

3,window.name 或者 window.test();

其中函数test中的age变量前面没有使用 var 声明,解释器会认为它在test的上一层定义的,如果在上一层未有找到定义它的“父亲”它会依次向上寻找直到找到了window这个祖先,此时age会被挂载到window对象下成为一个全局变量,这有点像dom中寻找父元素;

使用全局变量虽然程序运行时速度会更快一些,但是他会带来很多问题因为它会降低程序之间的灵活性,增大各个模块之间的耦合性。在多人协作的时候如果定义过多的全局变量有可能造成全局变量冲突,也就是全局变量的污染问题。 

  那为了避免过多这样的冲突,以及模块之间的耦合性更低,需要减少这样的污染。此时我们会想,那不要把变量定义在全局呗,采用类似C++的命名空间,Java的包的思路就行啦。首先就是将不同的模块划入到不同的全局“包”(这里的包的概念实际上就是一个Javascript对象而已)。

例如,程序员A为全局添加一个A变量,然后他把自己定义的函数/变量全部挂到A底下,这样就跟程序员B所定义的隔离了。

再者我们可以使用函数域来隔离一些局部变量的冲突,比如说程序员A写的代码如下:

Js代码 

  1. (function(obj){  
  2.     /* 在这里边就与外边隔离了,定义的局部变量不会与外界干扰 */  
  3.     /* 为了跟外界达到共享的目的,还可以为其加入参数,例如obj,在最后调用的时候把相关的参数传进来,例如下边的window */  
  4.       
  5.     var A = {};//定义一个A包  
  6.     var tmp;//临时变量  
  7.   
  8.     A.i = 1;//定义这个包里边的i变量  
  9.     A.func = function(){alert('I am A');};  
  10.       
  11.     obj.A = A;/* 把A包挂到obj底下 */  
  12.       
  13. })(window);  

当离开了这个函数域之后,tmp等局部变量被销毁(只要不要存在在闭包里边),程序员A定义的东西通通挂到了变量window.A底下,从而减少了很多污染,避免了不必要的冲突。

 

 

下面是从别处复制过来的:

在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题,以下是两种解决办法

一.定义全局变量命名空间
只创建一个全局变量,并定义该变量为当前应用容器,把其他全局变量追加在该命名空间下

var MY={};
my.name={
big_name:"zhangsan",
small_name:"lisi"
};
my.work={
school_work:"study",
family_work:"we are"
};
二 . 利用匿名函数将脚本包裹起来

(function(){
var exp={};
var name="aa";
exp.method=function(){
return name;
};
window.ex=exp;
})();

 



posted @ 2017-04-21 10:52  Chatillon  阅读(878)  评论(0)    收藏  举报