转载自:http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html,略改

  • JavaScript的变量作用域是基于其特有的作用域链
  • JavaScript没有块级作用域
  • 函数中声明的变量在整个函数中都有定义

1.JavaScript的作用域链

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需要查找一个变量时,首先查找作用域链第一个对象,如果第一个对象没有定义,则顺序向后查找。

2.函数体内部,局部变量的优先级比同名的全局变量高

var rain = 1;
function check(){
  var rain = 100;
  alert(rain);
}
check();    //100 
alert(rain);  //1

3.JavaScript没有快级作用域

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中是全局的

4.函数中声明的变量在整个函数中都有定义

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

5.未使用var关键字定义的变量都是全局变量

function rain(){
  x = 100;
}
rain();
alert(x);  //100

6.全局变量都是window对象的属性

var x = 100;
alert(window.x); //100