相关概念
运行期上下文:
当函数执行时(也可以是执行前),会创建一个成为执行期上下文的内部对象 ,一个执行期上下文定义了一个函数执行时的环境AO/GO,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用会导致创建多个执行上下文,当函数执行完毕,他所产生的执行上下文被销毁;
[[scope]]属性:
每个Javascript函数都是一个对象,对象中有一些属性我们可以访问,但是有些不行,这些属性,仅供JavaScript引擎存取,
[ [ s c o p e ] ],就是其中一个,[ [ s c o p e ] ],指的就是我们所说的作用域,其中储存了运行期上下文的集合,
作用域链:
[ [ s c o p e ] ] 中所储存的执行期上下文对象的集合,呈链式链接结构,我们把这种链式链接叫做作用域链。
查找变量:
在哪个函数查找变量,就从哪个函数的作用域顶端查找变量
function a(){ //1.当函数a被定义的时候,在a.scope作用域链产生一个GO在作用域链的最顶端0位,类数组,0:GO:{a:function}
var aa = 100;
function b(){
var cc = 100;
console.log(cc)
aa = 10;
} b(); //3当函数b被调用的时候,在函数b的内部继承了 之前scope作用域链,并把自己的AO 放在最顶端 :0 AO:{cc:100}
// 1 AO:{aa:100,b:function}
// 2:GO:{a:function}
// 在b函数的scope作用域链,改变aa的值,可以从作用域顶端查找变量,
//结果是可以更改的,也就证明了b函数生成的作用域链是引用了他外部函数AO以及GO
console.log(aa)
}
a()//2. 当函数被调用的时候,在a函数的内部,产生了AO的执行期上下文,放在作用域链的最顶端0位:0 :AO{aa:100,b:function}
// 1: GO{a:function}
// 总结 其实每次内部产生新的作用域scope 都会引用之前的scope,并把当前的scope AO 置顶,并在需要的时候从顶端往下查询变量
图片代码
每一次 函数结束后,每次产生的执行期上下文都会被销毁,等下次执行,产生新的类似执行期上下文,重新放在顶端,周而复始,循环下去
类似,就是虽然看上去一样,但不是同一个,这次执行和上次执行不是一个AO,每次执行都会产生新的作用域链