1. 作用域
- 上一级在执行时,内部函数被定义,内部函数便生成作用域和作用域链(拿上一级的环境),内部函数执行前生成自己的AO,并排在头部
- 函数执行结束时,AO被销毁(回到被定义时的状态)
- 上一级函数销毁时,AO被销毁(其中含内部函数,和其作用域)
- 作用域链里存的是AO、GO的引用
- 每个函数在被定义时,就包含了全局上下文GO,即使这时函数还没被执行
- a函数在被执行的前一刻,做预编译
- b函数被定义时,它的作用域链和a函数是一样的(同理a函数被定义时,a的作用域链是GO)
2. 闭包
- 闭包的定义:闭包是指有权访问另一个函数作用域中的变量的函数(并不是只有函数内返回函数的情况才是闭包)
- 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
function init() {var name = "Mozilla"; // name 是一个被 init 创建的局部变量function displayName() { // displayName() 是内部函数,一个闭包alert(name); // 使用了父函数中声明的变量}displayName();
}
init();
- 闭包拉扯着父级函数的AO不释放,闭包的函数运行在哪个环境,这个环境就能访问到被拉扯着的AO
-
test2被放到了全局,无法跟着test1销毁
-
内存泄漏:内存越来越少
-
闭包可以做数据缓存
-
闭包:也就是内部能拉扯外部AO的函数,能在全局被访问,那么直接把它添加到全局,也能有一样的效果