遇到全局变量与局部变量的时候总是出一些或多或少的问题,于是专门花时间去认真研究了一下全局变量与局部变量。

 

这是在网上看到的一个关于全局变量与局部变量的代码,看了下作者的解析,自己也进行了研究。

 1 <script>  
 2    var a =1;  
 3    function test(){  
 4       alert(a);  
 5       var a = 2;  
 6       alert(a);  
 7    }  
 8    test();  
 9    alert(a);  
10 </script>

第一反应的输出结果应该是1  2  1,其实结果不对(正确的运行结果 undefined 2 1),真实的代码执行顺序应为

 

<script>  
   var a =1;  
   function test(){  
      var = a;
      alert(a);  
      a = 2;  
      alert(a);  
   }  
   test();  
   alert(a);  
</script>    

根据预编译:

1、只有关键字函数会进行声明提前 字面量函数不会被提前的
2、所以变量会提升执行代码的最顶部,变量的值只会在原地等赋值给变量(赋值语句不会被提升)
3、如果全局变量和局部变量是一个变量名的话 在函数内部优先考虑就近原则;

 

  简单的说就是var的提升

  如var a = 1;

  把var定义的变量提升到script的最上方    var = a;(此处定义在function内部所以为局部变量)

  赋值语句不会被提升(哪怕=后面是一个function)   a = 1;

  所以就导致了a先被定义而没赋值所以输出第一个为undefined

  到第二个输出的时候此时 a = 2; a已经被赋值为2了,所以输出第二个为2

  第三个输出时 此时已经跳出了function ,输出的a,计算机就找到了一开始定义的全局变量  var a =1; ,所以输出第三个为1

 

Javascript的变量的scope是根据方法块来划分的  其中 只有function会对局部变量与全局变量产生影响

也就是说,在function中定义的变量不能跳出function的{ }

而在while、for、if中定义并使用的变量是可以跳出{ }的

 1 <script type="text/javascript">
 2 
 3       
 4     function test(){
 5         var a = 1; 
 6     }
 7     alert(a); //报错:a is not defined,因为a是没有跳出function
 8 
 9     for(var i=1;i<=3;i++){
10         alert(i); //依次显示 1  2  3
11     }
12     alert(i);  //显示 4 很明显此时i跳出了for的{ }
13 
14 </script>

 

posted on 2017-08-17 20:41  未知代码  阅读(857)  评论(3编辑  收藏  举报