JS的全局变量与局部变量及变量的提升

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

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

 <script>
var a =1;
function test(){
alert(a);
var a = 2;
alert(a);
}
test();
alert(a);
</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中定义并使用的变量是可以跳出{ }的

 <script type="text/javascript">

     function test(){
var a = 1;
}
alert(a); //报错:a is not defined,因为a是没有跳出function for(var i=1;i<=3;i++){
alert(i); //依次显示 1 2 3
}
alert(i); //显示 4 很明显此时i跳出了for的{ } </script>
上一篇:saltstack之(六)配置管理state


下一篇:MemCached add命令的用法详解