文章目录
- 【JavaScript进阶之旅 第五章】 作用域 作用域链 预编译 闭包基础
- 作用域链
- 预编译
- 闭包
【JavaScript进阶之旅 第五章】 作用域 作用域链 预编译 闭包基础
作用域链
AO GO 为了解决作用域、作用域链相关所产生的一切问题
[[scope]]
函数创建时,生成的一个JS内部隐式属性。函数存储作用域链的容器,作用域链。
AO:函数执行期上下文
GO:全局执行期上下文
函数执行完成后,AO要销毁,AO是一个及时的存储容器。
预编译
function a() {
function b() {
function c() {
}
c();
}
b();
}
a();
/**
* a定义: 生成 a.[[scope]] -> 0: GO
a执行: 生成 a.[[scope]] -> 0: a -> AO 1: GO
b定义: 生成 b.[[scope]] -> 0: a -> AO 1: GO
b执行: 生成 b.[[scope]] -> 0: b -> AO 1: a -> AO 2: GO
c定义: 生成 c.[[scope]] -> 0: b -> AO 1: a -> AO 2: GO
c执行: 生成 c.[[scope]] -> 0: c -> AO 1: b -> AO 2: a -> AO 3: GO
c结束: c.[[scope]] -> 1: b -> AO 2: a -> AO 3: GO
b结束: b.[[scope]] -> 0: a -> AO 1: GO
c.[[scope]] -> 销毁
a结束: a.[[scope]] -> 0: GO
b.[[scope]] -> 销毁
*/
闭包
当内部函数被返回到外部并保存时,一定会产生闭包,闭包会保持原来的作用域链不释放。