JavaScript中全局变量和局部变量容易混淆的几个问题

在函数(function)块中定义的变量,如果带有var,则是局部变量,如果不带,则是全局变量。例如:

function test() {
  var message="Hello";      //局部变量  
}
test();
alert(message);    //错误!!!

但是去掉var之后,上面的程序是正确的。

function test() {
  message="Hello";      //全局变量  
}
test();
alert(message);    //正确,输出"Hello"

还有一个经常会导致误解的问题,我们先看源程序:

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

我们会想当然地认为会输出1 2 1,但我们运行之后得到的结果是undefined 2 1,这是为什么呢?这是因为Javascript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定实变量的作用域。怎么理解?下面我在源程序中说明,方便大家理解。

<script>
    var a =1;
    function test(){
        alert(a); //a为undefined! 这个a并不是全局变量,这是因为在function scope里已经声明了(函数体倒数第4行)一个重名的局部变量,
                     //所以全局变量a被覆盖了,这说明了Javascript在执行前会对整个脚本文件的定义部分做完整分析,所以在函数test()执行前,
                     //函数体中的变量a就被指向内部的局部变量.而不是指向外部的全局变量. 但这时a只有声明,还没赋值,所以输出undefined。
        a=4       
        alert(a);  //a为4,没悬念了吧? 这里的a还是局部变量哦!
        var a;     //局部变量a在这行声明
        alert(a);  //a还是为4,这是因为之前已把4赋给a了
    }
    test();
    alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值
</script>

 

 

 

 

posted on 2012-10-11 13:24  ELVIS9090  阅读(278)  评论(0)    收藏  举报

导航