function a(){
function b(){
var b = 234;
}
var a = 123;
b();
}
var glob = 100;
a();
函数是一个特殊的对象,在函数声明的时候已经产生属性其中包括[[scope]],[[scope]]是作用域链,里面存放的是执行期上下文对象(AO,GO)的集合
铺垫完成,看题目function a(){}函数声明产生[[scope]]此时里面存放的是执行期上下文对象GO
GO{
glob : 100,
a : function a(){}
}
当执行语句执行到a();之前发生预编译产生执行期上下文AO
AO{
a : 123,
b : function b(){}
}
存放到由function a(){}函数声明产生[[scope]]中,此时[[scope]]中的排序是先AO再GO
function b(){}函数声明产生[[scope]]此时里面存放的是执行期上下文对象AO GO
AO{
a : 123,
b : function b(){}
}
GO{
glob : 100,
a : function a(){}
}
当执行语句执行到b();之前发生预编译产生执行期上下文AO
AO{
b : 234,
}
存放到由function b(){}函数声明产生[[scope]]中,此时[[scope]]中的排序是先AO先AO再GO且第二个AO和当执行语句执行到b();之前发生预编译产生执行期上下文AO是同一个AO,可以相互影响
我们重新看下概念[[scope]]是作用域链,里面存放的是执行期上下文对象(AO,GO)的集合
这样的先AO先AO再GO就是执行期上下文对象(AO,GO)的集合也是作用域链的体现
当执行完b();由预编译产生执行期上下文AO被销毁
只剩下AOGO
当执行完a();由预编译产生执行期上下文AO被销毁
只剩下GO