作用域、作用域链
-
Intro
-
对象
-
函数也是一种对象类型
-
有些属性是我们无法访问的,即js引擎内部私有属性
-
比如[[scope]]
-
函数创建时生成
-
函数存储作用域链的容器
-
作用域就是保存AO GO用的
-
函数执行完成以后AO被销毁,下一次执行函数时再生成新的AO
-
作用域链
-
函数被定义时,作用域(链)生成并在第0位存上一级环境上下文
-
函数在预编译阶段执行的前一刻,创建AO并在第0位存自己的AO,第1位存上一个环境的上下文...;查找变量时从0 -> 1 -> 2...找
-
函数执行完成后销毁且仅销毁当前不存在引用关系的AO
-
永远是上一层****函数执行时,内部函数被定义
作用域链角度理解闭包基础
function test1() {
function test2() {
var b = 2;
console.log(a);
}
var a = 1;
return test2;
}
var c = 3;
var test3 = test1();
test3();
-
GC
-
root构建图,当前元素不存在引用关系时销毁
-
不存在引用关系时销毁
-
当内部函数被返回到外部并保存时,一定会产生闭包,闭包会产生原来的作用域链不释放,过度的闭包可能会导致内存泄漏,或加载过慢。
-
简单应用:数据缓存篇:闭包实现累加/累减器
-
function test() { var n = 100; console.log(n); function add() { n++; console.log(n); } function reduce() { n--; console.log(n); } return [add, reduce]; } var arr = test(); arr[0](); // 101 arr[1](); // 100 arr[1](); // 99