js对象有两种成员
一种是上文成员(js语法可以直接访问的成员)
一种是下文成员(底层语法访问的成员) [[scopes]]括起来的成员名 就是下文成员
[[scopes]]这个"对象"内部保存的就是函数的作用域
函数在定义/声明的时候 就有了[[scopes]] 里面保存了上层的AO对象
函数调用时生成AO对象 会把AO对象放在scopes
每次调用都会放在scopes顶部(理解为栈)
代码演示:
<script>
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:b函数}
用数组来模拟作用域链,越底层在越后面
a.[[scopes]] ==>[AO(a):{aaa:123,b函数,},Go]
b.[[scopes]] ==>[AO(b),AO(a)] ==>[AO(b):{bbb:234,打印aaa},AO(a):{aaa:123,b函数,},Go]
打印aaa在作用域链中往下寻找,在我写这里就是往后寻找,打印123
*/
</script>