函数体系预编译
1、创建AO对象
2、找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
3、将实参值和形参统一
4、在函数体里找函数声明,值赋予函数体
全局预编译
1、生成一个GO对象
2、找变量声明,将变量和形参名作为GO属性名,值为undefined
3、找函数声明,值赋予函数体
作用域链
**[[scope]]:**每个JavaScript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。
[[scop]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。
作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域。
1、
function a(){
var a = 123;
function b(){
var b = 234;
}
}
每个函数在声明时会创建一个GO,被调用时会创建一个AO,然后把AO放在作用域链的首位,GO放在第二位。查找变量时从作用域首位开始找,找不到再找第二位。
2、
function a(){
var a = 123;
function b(){
var b = 234;
}
}
函数b会在函数a所创建的环境基础下创建自己的AO,然后把自己的AO放在自己的作用域链的首位。查找变量时从作用域链首位开始查找。