作用域的深层次理解:
执行期的上下文:
当函数代码执行的前期,会创建一个执行期上下文的内部对象AO(作用域)
这个内部的对象是预编译的时候创建出来的,因为当函数被调用的时候,会先进行预编译
在全局代码执行的前期会创建一个执行期的上下文对象(GO)
函数作用域预编译:
1.创建AO对象 AO{}
2.找形参和变量声明,将变量和形参名当做AO对象的属性名,值为undefined
3.实参形参相统一
4.在函数体里面找函数声明,值赋予函数体
全局作用域的预编译:
1.创建GO对象
2.找变量声明,将变量名作为GO对象的属性名,值为undefined
3.找函数声明,值赋予函数体
作用域链:
会被保存到一个隐式的属性中去 scope 这个属性是我们用户访问不到的,但是确实是实际存在的,由js引擎来访问,里面存储的就是作用域链AO、GO、AO和GO的集合