js中全部变量与局部变量的问题与闭包

来源:互联网 发布:知乎成功的原因 编辑:程序博客网 时间:2024/04/30 10:22

在javascript中,全部变量与局部变量是新手们最容易接触到的问题,今天就来讲一下全局变量与局部变量的差异:


先来说一下闭包这个概念,闭包是指子函数使用父函数的局部变量,即function使用了function本身之外的函数。


全局变量可理解为在函数外声明,但在函数中调用依然可以获得,即

<script type="text/javascript">
var a = 'z';
function test(){
alert(a);
}
test();
</script>

此处 a 是在function外声明的,但使用function时,任可获得,证明全局变量也可在函数中使用。




局部变量可理解为在某函数内声明,且只能在声明的那个函数中使用,即

<script type="text/javascript">
var a = 'z';
function test(){
var a = 'x';
alert(a);
}
test();
alert(a);
</script>

此时运行代码 ,可发现会弹出两次对话框,一次为 z, 一次为 x,因为根据顺序结构,此处先调用了function test中的alert(a),且弹出结果为z,之后再运行外面的aler(a),而外面的a = 'x',故结果为先 z ,其次为 x


可见,在函数中声明局部变量只会影响函数内的变量,并不会影响到外面的全局变量,即使他们变量名相同。



那么我们来做一道题,代码如下

<script type="text/javascript">  
  var a = 'z';  
  function test(){  
  var a;
    alert(a);  
    a = 'x';  
    alert(a);  
  }  
  test();
  alert(a);
</script>


此题运行结果为 undefined、x和z ,因为在函数中再次声明了a,但没有赋值,故第一次结果为undefined ,接下来a='x',第二次结果就为x,第三次alert(a)中的a为全局变量的a,故结果为z。再次证明局部变量不会影响全局变量。



然而我在浏览别人的文章时发现下面这段代码,然而这段代码和上面所说并不相同

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


此题根据以上思路,根据顺序结构,先弹出 1 ,其次弹出 2 ,最后弹出 1,然后运行代码后发现,结果为undefined,2,1

这是我觉得奇怪的一点,至于为什么可去@zyz511919766的博客看

http://blog.csdn.net/zyz511919766/article/details/7276089  此为链接


谢谢观看

0 0