执行上下文、变量对象、作用域链与闭包
关系
执行上下文
包含:变量对象
和作用域链
变量对象
包含:arguments
活动对象
包含:赋值的arguments
和this
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // 执行上下文 testEC = { // 变量对象 VO: { arguments: {...}, foo: <foo reference> // 表示foo的地址引用 a: undefined }, // (活动对象) AO: { arguments: {...}, foo: <foo reference> // 表示foo的地址引用 a: 1, this: window }, // 作用域链 scopeChain: scopeChain: [VO(innerTest),VO(global)], }
|
执行上下文
- 「定义」:函数运行时创建的
执行环境
- 「机制」:函数执行时
入栈
,执行完出栈
- 「包括」:
全局
执行上下文/函数
执行上下文/eval
执行上下文
- 「创建」:创建
变量对象
、this
- 「代码执行」:
变量赋值
- 「销毁」:执行上下文
出栈
、内存空间失去引用等待回收
变量对象
- 「创建过程」:
arguments
=> 函数声明
=> 变量声明
- 「执行」:栈顶的执行上下文,
变量对象(VO)
–[赋值、this]
–> 活动对象(AO)
作用域链
- 「作用域」:
词法环境
,写代码的时候就已经确定了
- 「作用域链」:
当前环境
与上层环境
的一系列变量对象
组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问。
闭包
- 通过闭包,我们可以在其他的
执行上下文
中,访问到函数的内部变量
- 由于作用域链中连接到了其他变量对象,因此其自身执行上下文出栈后仍
未失去引用
,不会被垃圾回收
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var fn = null; function foo() { var a = 2; function innnerFoo() { console.log(a); } fn = innnerFoo; }
function bar() { fn(); }
foo(); bar();
|