概念
-
Scope指的是我们所说的作用域,其中存储了运行期上下文的集合
-
作用域链:scope中所存储的执行期上下文对象的集合,这个集合链式存储,我们把这种链式链接叫做作用域链
-
执行期上下文:在函数执行的前一刻,会创建一个称为执行期上下文的内部对象
一个执行期上下文定义了一个函数执行的时候的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕时,它所产生的执行上下文被销毁 -
查找变量:在哪个函数查找变量,就从哪个函数的作用域链的顶端往下查找
案例1
function a(){
}
var glob = 100;
a();
当a函数被定义的时候,一定有自己的属性和方法像a.name = a,也一定有一个a.[[scope]]存的是作用域链,作用域链里面装的上下文集合。
1 a函数刚刚被定义的时候 a.[[scope]]-->0 : GO{}
2 a函数被执行的时候scope里面把自己新建的AO对象放在作用域的顶端 :
a.[[scope]]-->0 : AO{}
-->1 : GO{}
分析案例2
利用下面的案例来理解函数作用域和作用域链:
function a(){
function b(){
var b = 234;
}
var a = 123;
b();
}
var glob = 100;
a();
1,首先a函数被定义的时候,a函数里面有一个scope属性,scope里面存一个全局的执行上下文GO对象。
2,a函数被执行,生成一个自己的执行期上下文AO对象,把它放在作用域链的最顶端。这个时候scope里面存的值就有AO和GO。
3,随着a函数的执行,b函数被创建了,它获得了a的劳动成果,就是拿到了a的AO和GO。
4,b函数的执行,自己又会创建一个执行期上下文AO对象,放在作用域链的最顶端。
案例3
function a(){
function b(){
function c(){
}
c();
}
b();
}
a();
//
a defined a.[[scope]]--> 0 : GO
a doing a.[[scope]]--> 0 : aAO
1 : GO
b defined b.[[scope]]--> 0 : aAO
1 : GO
b doing b.[[scope]]--> 0 : bAO
1 : aAO
2 : GO
c defined c.[[scope]]--> 0 : bAO
1 : aAO
2 : GO
c doing c.[[scope]]--> 0 : cAO
1 : bAO
2 : aAO
3 : GO
c执行完之后销毁C的执行上下文cAO,,回到被定义的状态等待再次被调用。
当再次调用c函数的时候,会产生一个新的cAO,与原先的不是同一个,以前的那个已经被销毁了。