版权声明:转载请注明来源 https://blog.csdn.net/BigDaruizi/article/details/82389787
一、相关知识
1、执行期上下文
函数执行的前一刻,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕时,它所产生的执行上下文会被销毁。
2、作用域
每个JavaScript函数都是一个特殊的对象,对象中有的属性我们可以访问,但有的不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个,[[scope]]就指的是作用域,其中存储了运行期上下文的集合。
3、作用域链
每个函数执行的时候都有自己的执行环境。当代码在一个环境中执行的时候,会创建对象的一个作用域链(scope chain),也就是[[scope]]中所存储的执行期上下文对象的链式集合链接。
注意点:查找变量是从作用域链的顶部依次向下查找。全局执行环境是最外围的一个执行环境,在Web浏览器中,全局执行环境被认为是window对象。某个执行环境中的所有代码被执行完毕之后,该环境会被销毁,保存在其中所有的变量和函数定义也会随之被销毁。
二、全局环境与局部环境
内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。这些环境之间的联系是线性的、有次序的。在每个环境中都可以向上搜索存在的作用域链;但是任何环境都不能通过向下搜索作用域链而进入另一个执行环境。(注:本实例来自于《JavaScript高级程序设计》一书)
var color = "blue";
function changeColor () {
var anotherColor = "red";
function swapColor (){
var tempColor = anotherColor;
anotherColor =color;
color = tempColor;
//这里可以访问color、anotherColor和tempColor
}
//这里可以访问color、changeColor,但是不能访问tempColor
swapColor();
}
//这里只能访问color
changeColor();
三、图解作用域链创建过程
以如下代码程序为例,用图来解释:
function a () {
function b () {
var b = 234;
}
var a = 123;
b();
}
var glob = 100;
a();