执行环境及作用域
- 执行环境 (execution context, 简称,环境)
- 定义了变量或函数有权访问的其他数据,决定了它们各自的行为
- 执行环境中的所有代码执行完毕后
- 该环境被销毁
- 保存其中的变量和函数也随之被销毁
- 当代码在一个执行环境中运行时,会创建variable object的作用域链 (scope chain)
- 用于有序回溯标识符
执行环境所关联的 variable object
每一个执行环境都有一个与之关联的变量对象 (variable object)
- 环境中定义的所有变量和函数,都保存在这个variable object中
- 我们编写的代码,无法访问这个variable object
- 解析器会在后台使用这个variable object
全局执行环境
全局执行环境是最外围的一个执行环境
- 根据ECMAScript的实现所在的宿主环境不同,用来表示执行环境的 variable object 也不同
- Web 浏览器中,是
window对象
- Web 浏览器中,是
- 直到应用程序退出时,才会被销毁。例如,关闭浏览器
- 其variable object始终是作用域链的最后一个
函数的执行环境
每一个函数都有自己的执行环境
- 其活动对象 (activation object)为其variable object
- variable object里包括了:
arguments对象- 包含函数的环境的variable object(依次从内到外,有序包含)
延长作用域链
虽然说,执行环境只有两种————全局和局部(函数)。但有其他办法来延长作用域链 以下两种语句中的变量,的作用域链会得到加长:
with()语句。将括号内的对象添加到作用域链的前端。- try-catch语句中的
catch块。将新创建的,包含被抛出的错误对象的声明的对象,添加到作用域链的前端
function buildUrl() {
var qa = "?debug=true";
with(location) {
var url = href + qs;
}
return url;
}
- 其中,url的作用域链被延长,使得url在buildUrl的执行环境中了。所以可以作为函数的值被返回
没有块级作用域
Javascript没有块级作用域
if (true) {
var color = "blue";
}
alert(color); //blue
for (var i=0; i < 10; i++)
{
doSomething(i);
}
alert(i); //10
声明变量的方式 和 作用域 的关系
使用
var声明的变量,会被自动添加到最接近的环境中
- 在函数内部,则为函数,这个局部环境
- 在
with语句中,则为其所在的函数,这个局部环境
没有用
var声明的变量,直接初始化,那么这个变量会被自动添加到全局环境中
function add(num1, num2) {
sum = num1 + num2;
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"