和我一起学习Javascript的全局变量

1。尽量减少全局对象的使用

是一个全局变量,您的Javascript应用程序和Web页面的所有代码都由这些全局变量共享,它们位于相同的全局命名空间中,所以当全局变量名的定义的两个不同部分的程序,但命名冲突时的不同效果是难以避免的。

对于网页来说,包含页面开发人员未编写的代码也是很常见的,例如:

第三方Javascript库
广告客户的脚本代码
第三方用户跟踪和分析脚本代码
不同类型的小部件,标志和按钮


例如,第三方脚本定义了一个称为结果的全局变量;然后,在函数中定义了一个名为结果的全局变量,结果是前面变量的后面,突然出现第三方脚本!

因为您不小心,在代码的某一点修改全局变量会导致依赖于全局变量的其他模块出错,并且错误的原因很难调试,很难找到。

此外,Web页面肯定使用窗口对象,浏览器引擎又遍历窗口属性,性能下降。

全局变量是不同模块之间的联系,模块只能通过全局变量相互访问。
当您可以使用本地变量时,您必须永远不要使用全局变量。



var i,n,和 / /全局
功能性高(球员){
总和= 0;
为(i = 1,I = player.length;我< n;i++){
总和=得分(球员{ });
}
返回和;
}




将这些变量保留为局部变量,并仅将其用作需要使用的代码的一部分。


功能性高(球员){
var,i,n,和;
总和= 0;
为(i = 1,I = player.length;我< n;i++){
总和=得分(球员{ });
}
返回和;
}




在浏览器中,这个关键字指向全局窗口对象。

Javascript的全局命名空间也暴露于全局对象,可以在程序全局范围内访问,这是该关键字的初始值。在Web浏览器中,全局对象绑定到全局窗口变量。


this.foo; / /未定义

this.foo; / /全球foo




类似地,更新全局对象会自动更新全局命名空间:


全局;
this.foo; / /全球foo
this.foo =改变;
已更改




通过声明var关键字并将属性设置为全局对象(通过这个关键字)来改变全局对象的两种方法

特征检测是通过全局对象检测当前运行的环境。例如,在ES5的JSON对象用于操作JSON数据。然后,如果(此JSON)可以用来确定当前操作环境是否支持JSON。


如果(!这个(JSON){
this.json = {
解析:…,
stringify:…
}
}




两。如何避免全局变量

方法1:只创建全局变量。


myapp.stooge = { {
名乔
姓:霍华德
};

myapp.flight = { {
航空公司:海洋
编号:815,
出发:{
国际航空运输协会:你
时间: 2004-09-22 14:55
城市:悉尼
},
到达:{
国际航空运输协会
时间:2004-09-23 10:42
城市:洛杉矶
}
};




方法二:使用模块模式


无功serial_maker =函数(){()

生成一个对象,该对象生成唯一的字符串。一
唯一的字符串是由两个部分组成的:前缀。
序列号。对象/附带
设置前缀和序列的方法
和Gensym / /数,产生独特的方法
字符串。

var前缀=;
var = 0;
返回{
set_prefix:功能(P){
前缀=字符串(p);
},
set_seq:函数(){
序列=;
},
Gensym:函数(){
var结果;
序列= 1;
返回结果;
}
};
(});

无功seqer = serial_maker();
seqer.set_prefix = Q;
seqer.set_seq = 1000;
var = seqer.gensym(独特的); / /独特的是q1000



所谓模块模式是创建一个函数,该函数包括私有变量和特权对象。特权对象的内容是使用闭包来访问私有变量的函数,最后返回特权对象。

首先,方法二,不仅可以作为一个全局变量,也可以用来声明一个全局变量局部。因为即使你不知道一个地方修改seqer,马上你就犯了一个错误,因为它是一个对象,而不是一个字符串。

方法三:零全局变量

零全局变量实际上是一种局部变量处理方法,适用于一个封闭的小代码块,只适用于某些特殊场景,最常见的是一些完全独立的脚本,其他脚本无法访问它。

使用零全局变量需要立即执行函数的使用,如下所示。


(函数(Win){)

严格使用;
var doc = win.document;
定义变量和其他编写代码
})




三。意想不到的全局变量

由于Javascript的两个特性,创建一个全局变量是非常容易的。首先,即使没有声明,也可以使用变量。其次,Javascript具有隐式全局概念,这意味着任何未声明的变量都将成为全局对象属性:


函数和(x,y){
不推荐写的:隐式全局变量
结果= x + y;
返回结果;
}




代码中的这个部分的结果没有被声明,代码运行良好,但是调用函数后,最终结果会有一个全局命名空间,这可能是问题的根源。

经验法则是总是使用var声明变量,如(和)函数的改进版本所演示的那样:


函数和(x,y){
var结果;
返回结果;
}




创建隐式全局变量的另一个例子是使用任务链进行部分var声明:


不要使用反例。
函数(){
var a = b = 0;

}




这样做的原因是从右到左的赋值,首先,赋值表达式B = 0,在这种情况下B是未声明的。这个表达式的返回值是0,然后0被赋值给局部变量,A,定义为变量。换句话说,就像你把它放进去一样:

var =(b = 0);

如果您已经准备好声明变量,这是一个很好的方法来使用链分配,并且它不会产生任何意外的全局变量,例如:


函数(){
var,b;
…a = b = 0; / 2是局部变量。
}




然而,避免全局变量的另一个原因是可移植性。如果您希望代码在不同的环境(主机)操作时,全局变量的使用非常小心,因为您将在宿主对象中不存在无意识的第一环境。

始终记住通过var关键字声明本地变量

使用皮棉工具确保没有全局变量的隐式声明。

以上是对javascript全局变量的介绍,希望对您有所帮助。