题1:
function a(){
function b(){
var b = 234;
}
var a = 123;
b();
}
var glob = 100;
a();
预编译状态:
a函数被定义时,发生如下过程:
a defined a.[[scope]] -- 0:GO{a:(function),glob:100}
程序运行状态:
a函数被执行时,发生如下过程:
a handle a.[[scope]] -- 0:aAO{b:(function),a:123}
1:GO的引用
b函数被定义时,发生如下过程:
b defined a.[[scope]] -- 0:aAO的引用
1:GO的引用
b函数被执行时,发生如下过程:
b handle b.[[scope]] -- 0:bAO{b:234}
1:aAO的引用
2:GO的引用
b函数被执行完,销毁b的执行上下文:
b handle b.[[scope]] -- 0:清空bAO的引用
1:aAO的引用
2:GO的引用
a函数被执行完,销毁b的执行上下文:
a handle a.[[scope]] -- 0:清空bAO的引用(由于aAO{b:(function),a:123}中有存了b函数,因此b函数被销毁)
1:GO的引用
预编译状态:
程序结束,a函数回到被定义状态:
a defined a.[[scope]] -- 0:GO{a:(function),glob:100}
问题一:
b函数执行时是把a函数AO的引用挂在及自己身上还是重新生成了
一个a函数AO
回答:b函数执行时是把a函数AO的引用挂在及自己身上
问题二:
是否有终点,生成的执行上下文会不会消失,因为我们所知道的一
个函数执行完后会销毁它的AO
回答:有终点,因为一个函数执行完后会销毁它的AO
题2:
function a(){
function b(){
function c(){
}
c();
}
b();
}
a();
执行过程:
a defined a.[[scope]] --> 0:GO
a handle a.[[scope]] --> 0:aAO
1:GO
b defined b.[[scope]] --> 0:aAO
1:GO
b handle b.[[scope]] --> 0:bAO
1:aAO
2:GO
c defined c.[[scope]] --> 0:bAO
1:aAO
2:GO
c handle c.[[scope]] --> 0:cAO
1:bAO
2:aAO
3:GO