每个函数在被调用的时候都会创建自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中(
环境栈:外层函数所创建的执行环境在栈底,内层函数所创建的执行环境在栈顶)。在函数执行之后,栈将其环境弹出,把控制权返回给上层的执行环境。
当代码在一个环境中执行时,就会创建由变量对象构成的一个作用域链。作用域链的前端,始终是当前执行环境的变量对象。全局执行环境的变量对象始终都是处于作用域链的最后一个位置上。
当代码在一个环境中执行时,就会创建由变量对象构成的一个作用域链。作用域链的前端,始终是当前执行环境的变量对象。全局执行环境的变量对象始终都是处于作用域链的最后一个位置上。
var color = "Blue";
function changeColor()
{
var anotherColor = "Red";
function swapColor()
{
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
//在这里可以访问到color、anotherColor、tempColor
}
swapColor();
//这里可以访问到color、anotherColor,但访问不到tempColor
}
chageColor();
alert("Color is now "+ color);
//这里只能访问到color
由此例,我们可以简单理解变量的作用域是以函数体划分开来的,内层函数可以访问到外层函数的变量,而外层函数访问不到其内层函数内的变量。
还有一个就是JavaScript是没有块级作用域的,if、else、for、while等里面声明的变量,在花括号之外是可以访问到的。