执行上下文和作用域

执行上下文的概念是Javascript中重要的一部分。变量或者函数的上下文决定了它们可以访问哪些数据,以及它们的行为。

每一个上下文都有一个关联的变量对象(variable object),而这个上下文中定义的所有变量和函数都会存在于这个对象中,变量对象是无法被代码访问的,但是程序处理数据时会用到它。

上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数(全局上下文在应用程序退出前才会销毁,比如关闭网页或退出浏览器)。

作用域链

上下文的代码在执行的时候,会创建变量对象的一个作用域链(scope chain)。这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序,代码正在执行的上下文的变量对象始终位于作用域链的最前端。

如果上下文是函数,则其活动对象(activiion object)用作变量对象。活动对象最初只有一个定义变量:arguments。作用域链中的下一个变量对象来自包含上下文,再下一个对象来自下一个包含上下文,以此类推直至全局上下文;全局上下文的变量对象始终是作用域链的最后一个变量对象。

var color = "blue";
function changeColor() {
 if (color === "blue") {
 color = "red";
 } else {
 color = "blue";
 }
}
changeColor();

对这个例子而言,函数 changeColor()的作用域链包含两个对象:一个是它自己的变量对象(就 是定义 arguments 对象的那个),另一个是全局上下文的变量对象。这个函数内部之所以能够访问变量 color,就是因为可以在作用域链中找到它。

上次更新: