关于作用域链《JavaScript高级程序设计》书上是这样说的:
当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。
标识符的解析是沿着作用域链一级一级搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级像后回溯,直到找到为止。如果找不到标识符,会导致错误的发生。
var color = "blue";
function changeColor() {
var anontherColor = "red";
function swapColor() {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColor();
}
changeColor();
作用域链图如下:
以上有三个执行环境,最外面一层是全局环境,在全局环境中包括
changeColor()
的局部环境和swapColor()
的局部环境。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。当执行swapColor()
时,他的变量对象在作用域链的最前端,后面依次是changeColor()
的变量对象和全局环境的变量对象,swapColor()
可以访问作用域链上所有的变量,除了自身执行环境中的变量,还包括changeColor()
执行环境中的变量和全局环境中的变量。swapColor()的 作用域链
当执行changeColor()
时,他在作用域链的最前端,后面是全局环境变量对象。changeColor()
可以访问changeColor()
的环境变量和全局环境中的变量,但不可以访问swapColor()
执行环境中的变量。
总结:内部环境可以用通过作用域链访问外部环境,但外部环境不能访问内部环境中的任何变量和函数。,每个环境可以向上搜索作用域链,查询变量和函数名。
网友评论