执行js代码时,会产生三种执行行上下文
全局执行上下文,函数执行上下文,eval执行上下文
其中有三个重要的属性 \
变量对象 VO 包括 函数,变量,该属性只能在全局上下文访问
作用域链 变量的作用域是在定义时就决定的
this
eg:
var a =10;
function(i){
var b= 20;
}
执行栈有两个
全局上下文和函数上下文
globalContext ,fooContext
对于全局上下文来说
VO : globalContext.VO===globe
globalContext.VO={
a:undefined //因为执行上下文时初始化环境时变量会创建变量名并赋值undefined
foo:<Function> // 执行上下文时初始化环境时函数会在内存中传入整个函数进去
}
对于函数上下文来说
VO不能访问,只能访问活动对象(AO)
fooContext.VO===foo.AO
fooContext.AO={
i:undefined
i:undefined
argumenrs:<>
}
对于作用域链
即包含自身变量对象和上级变量对象的列表,通过[[scope]]属性查找上级变量
fooContext.[[scope]]=[globalContext.VO] //foo执行上下文时,通过作用域链 往上 找到的上级变量对象
fooContext.scope = fooContext.[[scope]]+fooContext.VO
fooContext.scope=[
fooContext.VO
globalContext.VO
]