执行上下文、变量对象、作用域链与闭包
关系
执行上下文包含:变量对象和作用域链
变量对象包含: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();
|