遇到全局变量与局部变量的时候总是出一些或多或少的问题,于是专门花时间去认真研究了一下全局变量与局部变量。
这是在网上看到的一个关于全局变量与局部变量的代码,看了下作者的解析,自己也进行了研究。
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>