JS笔记:局部变量与全局变量
1.JavaScript中,变量无需事先声明可以直接使用,并且都是动态类型,类型可以随时更改,但它也具有局部变量和全局变量之分:脚本中直接定义的变量是全局变量,函数中定义的变量是局部变量,如下示例:
<body>
<script type="text/javascript">
var scope='global'; // global variable
function testScope(){
var scope='local'; // local variable
alert(scope);
}
testScope();
</script>
</body>
在局部变量和全局变量同名时,局部变量暂时覆盖全局变量来被使用,上述代码运行结果:
local
2.但是与Java、C等语言不同的是,JavaScript并没有块范围的概念,例如示例代码:
<body>
<script type="text/javascript">
var scope='global'; // global variable
function testScope(){
var scope='local'; // local variable
for(var i=0;i<10;++i){
document.write(i);
}
document.writeln("<br/>after for loop, i is "+i);
}
testScope();
</script>
</body>
运行结果为:
0123456789
after for loop, i is 10
可见,出了for循环,i仍然存在;所以这个特性有时会出现一些奇怪的情况,需要我们知道,比如下面这个例子的情况:
<body>
<script type="text/javascript">
var scope='global'; // global variable
function testScope(){
document.writeln(scope);
var scope='local'; // @1
document.writeln("<br/>"+scope);
}
testScope();
</script>
</body>
第一次试验,运行结果是:
undefined
local
可以看出,第一次写出的scope并非是全局变量’global’而是undefined,第二次确实是局部变量’local’了,如果将’@1’这行代码注释掉,进行第二次试验,则运行结果为:
global
global
就可以正确的引用全局变量了。这样的情况发生的原因是:定义变量时使用var和不使用var关键字是有区别的,区别在于,使用var时,程序会强制定义一个新变量,不使用var时,程序会在上下文中寻找这个变量,只有在该变量不存在的情况下,程序才会定义一个新变量。
所以,当存在’@1’这行代码时,直接使用scope变量,程序会在上下文中寻找这个变量,这时是存在局部变量scope的,只不过并未赋值,所以这时是undefined,定义过之后,该变量被赋值了,打印出来自然就是所赋的值’local’了,这就是第一次试验的结果;当不存在’@1’这行代码时,直接使用scope变量,程序在上下文中寻找,存在全局变量scope,则使用,于是出现第二次试验的结果了。所以在JS中使用变量需要尽量规范,避免出现奇怪的现象。