一:
<script>
var a ="1";
function test(){var a;
alert(a);
var a="2";
alert(a);
}
test();//undefined ; 2
alert(a);//1
var a ="3";
</script>
<script>
function test(){alert(a);
var a="4";
alert(a);
}
test();//undefined ;4
alert(a);//3
</script>
注意:全局变量跟局部变量重名时,局部变量的scope会覆盖掉全局变量的scope,当离开局部变量的scope后,又重回全局变量的scope
二:javascript的变量的scope是根据方法块来划分的(也就是以function的一对大括号{}来划分)。切记是function块,而for if while不是作用域划分标准。
<script>
function test2(){
alert("before for scope:"+i);//如果test2方法里,后面代码中没有对i进行复制或声明,则会报错,提示i,没有声明
for (var i = 0; i <3; i++) {
var j=0;
alert("in for scope:"+i);//i的值是0,1,2
}
alert("after for scope:"+i);//i的值为3,注意此时虽然在for scope以外,但i的值还是经过了i++,所以为3
alert("j="+j);//在if for while等内定义的值,在if for while之外还是能获取到。
}
test2();
alert(i);
</script>
注意:JavaScript在执行前会对整个脚本文件的声明部分做完整分析(包括局部变量),从而确定变量的作用域(如果一个函数中没有定义i,则肯定报错;如果在函数里,先alert(i),但是在后面声明的,则i会是undefined)
三:window.a会是全局变量,不会随同名的局部变量的变化而变化
- <script>
- var a =1;
- function test(){
- alert(window.a); //a为1,这里的a是全局变量哦!
- var a=2; //局部变量a在这行定义
- alert(a); //a为2,这里的a是局部变量哦!
- }
- test();
- alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值
- </script>
四:
- <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>