Js的全局变量和局部变量
全局变量
先来简单了解一下什么是全局变量
定义在函数外部,拥有全局作用域(即这个变量可以在函数中任何地方被访问)
举个小栗子:
<script>
var a=0;//我们在script中定义一个a
total();
function total(){
//在total这个函数用我们发现我们仍然可以调用a
alert(a);
}
</script>
局部变量
定义在函数内部,拥有局部作用域(即定义的变量在它所在的函数内可以调用)
举个栗子:
<script>
total();
function total(){
var a=0;
alert(a);
}
alert(a+1);//并未显示
</script
当我们把a定义在函数total中时,在外部访问变量a的时候会发现访问不到,这就是局部变量
有人说用var的就一定是局部变量,这对吗
很多人觉得在js中声明一个变量,加不加var都一样,这是一个错误的观点
如果是在函数外面,加不加var都是一样的,都是全局变量(所以加了var的变量不一定是局部变量)
但是如果是在函数内部声明一个变量,加var就是局部变量,不加就是全局变量
浅谈局部变量和全局变量的问题
我们先来看一个简单的栗子
<script>
var a =100;
function test(){
alert(a);
var a = 200;
alert(a);
}
test();
alert(a);
</script>
由于我们上面刚讲,这题大家都觉得输出应该是100,200,100对吧,但实际运行的结果是undefined,200,100,为什么呢?
首先,我们定义的一个a是一个全局变量,在test方法内又定义了一个a,这时局部变量的a覆盖了全局变量的a,也就是说a的值被替换成200了对吧,这里还没有什么问题,问题就出在,js的变量范围是根据方法块来划分的,js在执行前会对整个脚本文件的声明变量进行完整的分析,从而确定作用域,这一句是什么意思呢?
也就是说在我们执行这个js文件的时候,js先把所有的a(变量)进行了分析,由于test内由声明了一次a,局部变量a的作用域也就只存在于test中,全局变量a作用域存在在函数外不包括此test,也就是说当我们执行到test时,此时的a是局部变量,而我们js执行顺序是从上往下的,所以当我们alert(a)时,此时的a并没有被赋值,所以会输出undefined,然后执行到下一行,a赋值给200,输出200,离开test函数,用全局变量的a,最后也就是输出100
再写个例子
<script>
var a =1;
function test(){
console.log(a);
var a = 2;
console.log(a);
}
function test2(){
console.log(a);
}
test2();
test();
test2();//发现还是1,说明test中的a(局部变量)作用域只存在test中
console.log(a);
//输出 1 undefined 2 1 1
</script>
由于我们的第二个test2中并没有声明任何的局部变量,所以其中的a还是全局变量的值
来写个完整的例子:
<script>
function abb(){
console.log(a);//undefined
for(var a=0;a<2;a++){
var j=5;
console.log(j);//5
}
console.log(a);//2
console.log(j);//5
if(true)
var k;
k=1;//此时k还是局部变量
console.log(k);//1
}
abb();
// console.log(k);这里也是error,因为一旦出错就不会执行下一步,所以这里注释掉了
console.log(a);//error
</script>
我们发现,就算我们把a在for,if,while…中声明,a的作用域也是在整个function中,我们发现,for,if中定义的变量是在循环外还是可以被访问到的,说明for,while,if并不是作用域的划分标准