函数创建
函数在创建也就是代码写完的时候,系统就自动回给这个函数创建一个[[scope]]属性,会保存所有的父级VO到里面。
举个例子:
function foo() {
function bar() {
...
}
}
有两个函数创建了,所以每个都有自己的[[scope]]:
foo.[[scope]] = [
globalContext.VO
];
bar.[[scope]] = [
fooContext.AO,
globalContext.VO
];
当函数激活也就是执行函数时,按分析阶段和执行阶段来分析。
举个例子:
var scope = "global scope";
function checkscope(){
var scope2 = 'local scope';
return scope2;
}
checkscope();
创建函数:
checkscope.[[scope]] = [
globalContext.VO
];
函数执行:
- 分析阶段
把函数的[[scope]]复制到函数上下文去
checkscopeContext = {
Scope: checkscope.[[scope]],
}
初始化AO,加入arguments,函数声明,变量声明:
checkscopeContext = {
AO: {
arguments: {
length: 0
},
scope2: undefined
},
Scope: checkscope.[[scope]],
}
把AO放入作用域链Scope中去:
checkscopeContext = {
AO: {
arguments: {
length: 0
},
scope2: undefined
},
Scope: [AO, [[Scope]]]
}
- 代码执行阶段 顺序执行代码,修改AO的值
checkscopeContext = {
AO: {
arguments: {
length: 0
},
scope2: 'local scope'
},
Scope: [AO, [[Scope]]]
}