函数每被调用一次都会在内存中开辟出一块新的空间。

    预编译阶段就是执行前的一刻,找到定义的变量及函数。

    1. function b() {
    2. ....
    3. function c() {....}
    4. }
    5. b()
    6. var a = 1
    7. // GO = {
    8. // a: undefined
    9. // b: function b() {....}
    10. // }

    当全局被执行的时候。函数b被执行。也就是在函数b被执行前。预编译阶段会继承全局GO。
    当函数b被执行前会生成函数执行上下文AO,并且函数b的AO会放在作用域链的最顶端
    image.png
    当b执行的时候,c已经被定义,那么c在未执行的时候是继承b的AO以及GO。
    当c被执行的前一刻。会生成自己的AO。同样也会放到作用域链的最顶端。
    image.png
    当c函数执行结束后,函数被销毁 ,同样c的Ao也会被销毁。同时c的AO也会回到原始状态,被定义的时候。

    总结:
    作用域链是自上向下。外部函数没有内部函数的AO。所有外部函数不能获取到内部函数的属性。而内部函数由于AO是在作用域链的最上方,却有外部函数的AO。所以内部函数可以访问外部函数。