转载自:http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html,略改
var rain = 1;
function rainman(){
var man = 2;
funciton inner(){
var innerVar = 4;
alert(rain);
}
inner();
}
rainman();
在alert(rain);这句代码,JavaScript首先在inner函数中检查,否则则在rainman中查找,这段代码在rainmain()中没有定义,则最终查找的是全局变量中的rain。
作用域链:JavaScript需要查找一个变量时,首先查找作用域链第一个对象,如果第一个对象没有定义,则顺序向后查找。
var rain = 1;
function check(){
var rain = 100;
alert(rain);
}
check(); //100
alert(rain); //1
function rainmain(){
//rainman 函数体内存在三个局部变量 i j k
var i = 0;
if(1){
var j = 0;
for(var k=0;k<3;k++)
alert(k); //0,1,2
alert(k); // 3
}
alert(j); //0
}
i,j,k的作用域是相同的,他们在rainmain中是全局的
function rain(){
var x = 1;
function man(){
x = 100;
}
man(); //调用man
alert(x); //这里会弹出100
}
rain(); //调用rain
上面代码说明,变量x在整个rain体内都可以使用,并可以重新幅值。但是会有以下情况产生:
var x = 1;
function rain(){
alert(x); //undefined
var x = '3';
alert(x); //3
}
是由于rain定义了x,它会隐藏同名全局变量x。由于alert时还未定义,所以undefined
function rain(){
x = 100;
}
rain();
alert(x); //100
var x = 100;
alert(window.x); //100