一、作用域链是什么?
函数内部有个属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
也可以理解为:作用域的集合就是作用域链(子集可以访问父集,父集不能访问子集)
js对象有两种成员
一种是上文成员(js语法可以直接访问的成员)
一种是下文成员(底层语法访问的成员)
[[scopes]]括起来的成员名 就是下文成员
函数在定义/声明的时候 就有了[[scopes]] 里面保存了上层的AO对象
函数调用时会生成AO对象 AO保存在scopes对象内部的
二、作用域链的总结和分析
函数生成了就会有个属性 [[scopes]] 作用域"数组"(只能引擎使用)
函数调用时生成AO对象 会把AO对象放在scopes
每次调用都会放在scopes前面(顶部)
每个函数scopes数组中天生就有一个AO对象 就是这个函数的上层的AO
案例1:
function a() {
var aaa = 123;
function b() {
var bbb = 234;
console.log(aaa);
}
return b;
}
var glob = 100;
var demo = a();
demo();
分析:Go:{a函数,glob:100,demo:a.[[scopes对象里面的,b函数]]}
a.[[scopes]]=>[AO:{aaa:123,b函数,},Go]
b函数.[[scopes]]=>[,a.[[scopes]]]
demo() => AO(b)=>{bbb:234,打印aaa}
b函数.[[scopes]]=>[AO(b):{bbb:234,打印aaa},AO(a):{aaa:123,b函数,},Go]