枯燥的js作用域

每个函数都是一个对象,对象中有些属性可以访问,但有些不可以,[[scope]]就是其中之一。
[[scope]]指的就是我们所说的作用域,其中存储了执行期上下文的集合。
作用域链:[[scope]]所存储的执行期上下文对象的集合。

执行期上下文

当函数执行时,会创建一个称为执行期上下文的内部对象。每一个函数的执行期上下文都是独一无二的,当函数执行完毕会销毁。

一个函数执行时,[[scope]]相当于一个数组,第一位是AO,第二位是GO。
当一个函数被定义时,[[scope]]里面已经存有GO。执行时形成AO放在GO之前执行。
简而言之,先执行AO再执行GO且每个函数执行都会有一个AO
函数嵌套从内到外引用。

function a ( ){
    
    
            function b (){
    
    
                var b =234;
                a = 0;
                console.log(a);
            }
            var a =123;
            b();
            console.log(a);
        }
        var glob =100;
        a();

b函数中改变a 的值,在b函数执行后,a的值也被改变。

function a ( ){
    
    
            function b (){
    
    
                var b =234;
                var a = 0;
                console.log(a);
            }
            var a =123;
            b();
            console.log(a);
        }
        var glob =100;
        a();

但如果在b函数中声明a变量,则a函数中的a的值为123.