在ECMAScript中,只有两种执行环境,全局环境和函数环境,每个函数都是一个执行环境,包括嵌套函数。换句话说,其他情况下即使变量声明在一对大括号中,在括号外部仍然可以访问这些变量,例如:
for(var i=0;i<5;i++){
var num=20; //在for语句中声明的变量
}
alert(num); //在for语句外部调用变量,仍然可以得到num的值
对异常语句同样可以:
try{
var num=20; //在try语句中声明的变量
a=b; //引起一个异常
}catch(e){
alert(num); //在catch语句中调用变量,将得到20
}finally{
alert(num); //在finally语句中调用变量,将得到20
}
alert(num); //在try语句外部调用变量,将得到20
除了上面所演示的两种语句外,一对大括号也无法构成一个执行环境,例如:
{
num=1;
}
但是JavaScript没有块级作用域的一个例外恰好是其异常处理,try...catch语句将捕获的异常绑定到一个变量,该变量的作用域只是catch语句块。例如下面一段代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>ECMAScript中的执行环境</title>
</head>
<body>
<script>
function test(){
var x='var',result=[];
result.push(x);
try{
throw 'exception';
}catch(x){
//alert(x); 执行这一句会弹出exception
x='catch';
//alert(x); 执行这一句会弹出catch
}
//alert(x); 执行这一句会弹出var
result.push(x);
return result;
}
test();
</script>
</body>
</html>
运行结果如下: