和c,c++以及java不同,javascript没有块级作用域。函数中声明的所有变量,不论是在哪里声明的,在整个函数中他们都是定义的。在下面函数中,变量,i,j,k的作用域相同,他们在整个函数都是定义的。如果这段代码使用c,c++或java编写,情况就不是这样的了。
function test(o){
var i= 0; //在整个函数中i都有定义
if (typeof o=="object"){
var j=0; //j不仅在块中有定义,在这个函数都有定义。
for (var k=0;k<10 k++; ) //k不仅在块中有定义,在这个函数都有定义。
{
document.write(k); //k仍旧有定义输出10
}
document.write(k); //k仍旧有定义输出10
}
document.write(j); //j仍旧有定义,不过没有初始化。
}
下面代码说明了这一点。
var
scope
=
"
global
"
;
function f()
{
alert(scope) ; //显示undefined,而不是“global”
var scope ="local" ; //这里是初始化,不过在整块函数中都是可见的。
alert(scope) //显示"local"
}
f();
你可能认为对alert()的第一次调用会显示出“global”,因为声明局部变量的var 语句还没有执行。但是,由于这个作用域规则的限制,输出的并不是“gobal”。局部变量在整个函数体内都是有定义的, 这就意味着在整个函数体中都隐藏了同名的全局变量。虽然局部变量在整个个函数体中都是有定义的,但是在执行var语句之前,它是不会被初始化的。
function f()
{
alert(scope) ; //显示undefined,而不是“global”
var scope ="local" ; //这里是初始化,不过在整块函数中都是可见的。
alert(scope) //显示"local"
}
f();
同时这个例子也说明了为什么将所有的变量声明放在程序开头是个好的习惯