js总是可以在不知不觉中地创建了全局变量,其原因在于JavaScript的两个特性。
1.JavaScript可直接使用变量,甚至无需声明;
2.JavaScript有个暗示全局变量的概念,即任何变量,如果未经声明,就为全局对象所有(也就像正确声明过的全局变量一样可以访问)。
function sum(x,y){
//反模式:暗示全局变量
result=x+y;
return result;
}
在这个例子中,result未经声明就使用了。代码虽然在一般情况下可以正常工作,但如果在调用该函数后,在全局命名空间使用了另外的result变量,问题就会出现。此函数中的ruslt变量为全局变量。
另一种创建饮食全局变量的反模式是带有var声明的链式赋值。在下面的代码中,a是去不变量,b是全局变量。
//反模式,不要使用
function foo(){
var a=b=0;
//...
}
避免全局变量的另一个原因在于代码移植,如果你希望你的代码运行在不同的环境中(主机),使用全局变量就会非常危险。因为可能很偶然地,不存在与原环境(所以看起来非常安全的),但存在于其他环境的主句变量就被覆盖了。
for循环
for循环经常用在遍历数组或类数组对象,如引数(arguments)和HTML容器对象。通常for循环模式使用如下。
//次优循环
for(var i=0;i<marggay.length;i++){
//对ayarray[i]做操作
}
这种模式的问题在于每次循环迭代是都要访问数据的长度。这样会是代码变慢,特别是当ayarray不是数据,而是HTML容器对象时。容器的麻烦在于它们在document (HTML页面)下是活动的查询。也就是说,每次访问任何容器的长度时,也就是在查询活动的DOM,而通常DOM操作是非常耗时的。
所以一般好的for循环模式是将已经遍历过的数组(或容器)的长度缓存起来。
for(var i = 0, max = myarray.length; i < max; i++){
//对myarray[i]进行处理
}
这种方式下,对长度的值只提取一次,但应用到整个循环中。