这意味着全局名称空间将被污染?

这意味着全局命名空间将被污染吗?

我真的不明白全局名称空间被污染意味着什么

关于垃圾收集的快速说明

当变量失去作用域时,它们将有资格进行垃圾收集。如果它们是全局作用域,则在全局命名空间失去作用域之前,它们将不符合收集条件

以下是一个例子:

var arra=[];
对于(变量i=0;i<2003000;i++){
阵列推力(i*i+i);
}

将其添加到全局名称空间(至少对我来说)应该会占用10000 kb的内存(win7 firefox),而不会收集这些内存。其他浏览器可能会以不同的方式处理此问题

而在超出范围的范围内有相同的代码,如下所示:

(函数(){
var arra=[];
对于(变量i=0;i<2003000;i++){
阵列推力(i*i+i);
}
})();

将允许arra在闭包执行后失去作用域,并有资格进行垃圾收集

全局名称空间是您的朋友

尽管有很多人反对使用全局名称空间,但它是您的朋友。就像一个好朋友,你不应该滥用你的关系

温柔点

不要滥用(通常称为“污染”)全局命名空间。我所说的不要滥用全局名称空间的意思是——不要创建多个全局变量。下面是一个使用全局名称空间的坏例子

var x1=5;
var x2=20;
变量y1=3
变量y2=16;
var上升=y2-y1;
var-run=x2-x1;
var斜率=上升/运行;
var risesquared=上升*上升;
var runsquared=run*run;
var distancesquared=上升平方+运行平方;
var距离=数学sqrt(dinstancesquared);

这将创建11个全局变量,这些变量可能会被覆盖或误解

足智多谋

一种更为灵活的方法(不会污染全局名称空间)是在模块模式中封装这一切,只使用一个全局变量,同时公开多个变量

下面是一个示例:(请注意这很简单,没有错误处理)

//Calculate是唯一公开的全局变量
var Calculate=函数(){
//此闭包中的所有定义都是本地的,不会向全局命名空间公开
变量坐标=[];//坐标数组
变量坐标=函数(xcoord,ycoord){//类型坐标的定义
this.x=xcoord;//分配类似于构造函数的值
这个.y=ycoord;
};
return{//这些方法将通过Calculate对象公开
添加坐标:函数(x,y){
坐标。推(新坐标(x,y));//添加新坐标
},
斜率:函数(){//计算斜率并返回值
var c1=坐标[0];
var c2=坐标[1];
返回c2.y-c1.y/c2.x-c1.x;//计算溢出并返回结果
},
距离:函数(){
//即使声明了过多的变量,这些变量仍然是局部变量
var c1=坐标[0];
var c2=坐标[1];
var上升=c2.y-c1.y;
var run=c2.x-c1.x;
var risesquared=上升*上升;
var runsquared=run*run;
var distancesquared=上升平方+运行平方;
var距离=数学sqrt(距离平方);
返回距离;
}
};
};
//这是一个“自动执行闭包”,之所以使用它是因为这些变量
//作用域为函数,并且不会全局可用,也不会发生冲突
//使用全局命名空间中的任何变量名
(功能(){
var calc=计算();
计算坐标(5,20);
计算坐标(3,16);
console.log(计算坡度());
console.log(计算距离());
})();

发表评论