所有变量(包括基本类型和引用类型)都存在一个执行环境(也称为作用域链)当中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。
- 执行环境有全局执行环境(也称为全局环境)和函数执行环境之分
- 每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链
- 函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境
- 全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据
- 变量的执行环境有助于确定应该何时释放内存
var color = "blue";
function changeColor(){
var anotherColor = "red";
function swapColors(){
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
// 可以访问 color、anotherColor、tempColor
}
// 可以访问 color、anotherColor,不能访问tempColor
swapColors();
}
// 只能访问color
changeColor();
三个执行环境: 全局环境、 changeColor()局部环境、swapColor()局部环境;
swapColor()其作用域包含3个对象:swapColor()的变量对象、changeColor()的变量对象和全局变量对象;
swapColor()局部环境开始会先在自己的变量对象中搜索变量和函数名,如果搜索不到再搜索上一级作用域链。
延长作用域链
-
try-catch
语句的catch
块:创建新的变量对象,其中包含的是被抛出的错误对象的声明 -
with
语句:会将指定的对象添加到作用域链中
function buildUrl(){
var qs = "?debug=true";
with(location){
var url = href + qs;
}
return url;
}
没有块级作用域
- 声明变量
使用var声明的变量会自动被添加到最接近的环境中
在函数内部,最接近的环境就是函数的局部环境
function add(num1,num2){
var sum = sum1 + sum2;
return sum;
}
var result = add(10,20) ; //30
alert(sum) ; //由于sum不是有效的变量,因此会导致错误
若初始化没有使用var
声明,该变量会自动被添加到全局环境
function add(num1,num2){
sum = sum1 + sum2;
return sum;
}
var result = add(10,20); //30
alert(sum) ; //30
- 查询标识符
var color = "blue";
function getColor(){
return color;
}
alert(getColor()); // "blue"
var color = "blue";
function getColor(){
var color = "red";
return color;
}
alert(getColor()); // "red"
网友评论