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>
浙公网安备 33010602011771号