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并不是作用域的划分标准