在函数上下文中的变量对象,我们用活动对象来表示(activation object,这里简称AO),为什么称其为活动对象呢,因为只有到当进入一个执行上下文中,这个执行上下文的变量对象才会被激活,并且只有被激活的变量对象,其属性才能被访问。
在函数执行之前,会为当前函数创建执行上下文,并且在此时,会创建变量对象:
根据函数arguments属性初始化arguments对象;
根据函数声明生成对应的属性,其值为一个指向内存中函数的引用指针。如果函数名称已存在,则覆盖;
根据变量声明生成对应的属性,此时初始值为undefined。如果变量名已声明,则忽略该变量声明;
还是以刚才的代码为例:
var scope = 'global scope';function checkscope(s) { var scope = 'local scope'; function f() { return scope; } return f(); } checkscope('scope');
在执行checkscope函数之前,会为其创建执行上下文,并初始化变量对象,此时的变量对象为:
VO = { arguments: { 0: 'scope', length: 1, }, s: 'scope', // 传入的参数 f: pointer to function f(), scope: undefined, // 此时声明的变量为undefined }
随着checkscope函数的执行,变量对象被激活,变相对象内的属性随着代码的执行而改变:
VO = { arguments: { 0: 'scope', length: 1, }, s: 'scope', // 传入的参数 f: pointer to function f(), scope: 'local scope', // 变量赋值 }
其实也可以用另一个概念“函数提升”和“变量提升”来解释:
function checkscope(s) { function f() { // 函数提升 return scope; } var scope; // 变量声明提升 scope = 'local scope' // 变量对象的激活也相当于此时的变量赋值 return f(); }
网友评论文明上网理性发言 已有0人参与
发表评论: