变量的作用域


  1. 无块作用域,C语言中{}中定义的变量在外部是无法访问和使用的,但JS不会销毁这些临时变量。
for (var i=0; i < 10; i++)
{ doSomething(i);
}
alert(i); //10
if (true) {
var color = "blue";
}
alert(color); //"blue"

  1. 使用var 声明的变量会自动被添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境;在with 语句中,最接近的环境是函数环境。如果初始化变量时没有使用var 声明,该变量会自动被添加到全局环境。
function add(num1, num2) {
sum = num1 + num2;        // 如果没有加var则会变成全局变量....加var则无法在外部访问。
return sum;
}
var result = add(10, 20); //30
alert(sum); //30
function f1(){
  var n=999;
  nAdd=function(){n+=1}
  function f2(){
    alert(n);
  }
  return f2;
}
var result=f1();
result(); // 999
nAdd();                  // 因为是全局变量(nAdd 没加var),所以可以直接访问。
result(); // 1000

变量在局部没声明也没关系,可以跳出{}找外面一层的变量代替。

var color = "blue";
function getColor(){
return color;
}
alert(getColor()); //"blue"

如果想引用外面的全局变量怎么办?

window.变量名就可以了,如果不是在对象中的话this也行,但不推荐。

JS代码函数嵌套时的作用域 :
function f1(){
  n=999;
  function f2(){
    alert(n); // 999
  }
}

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。


你可能感兴趣的:(变量的作用域)