作用域的深层次理解:

执行期的上下文:

当函数代码执行的前期,会创建一个执行期上下文的内部对象AO(作用域)

这个内部的对象是预编译的时候创建出来的,因为当函数被调用的时候,会先进行预编译

在全局代码执行的前期会创建一个执行期的上下文对象(GO)

函数作用域预编译:

1.创建AO对象 AO{}

2.找形参和变量声明,将变量和形参名当做AO对象的属性名,值为undefined

3.实参形参相统一

4.在函数体里面找函数声明,值赋予函数体

全局作用域的预编译:

1.创建GO对象

2.找变量声明,将变量名作为GO对象的属性名,值为undefined

3.找函数声明,值赋予函数体

作用域链:

 会被保存到一个隐式的属性中去 scope 这个属性是我们用户访问不到的,但是确实是实际存在的,由js引擎来访问,里面存储的就是作用域链AO、GO、AO和GO的集合