【颠覆认知的JS】- 6. 作用域、作用域链、预编译、闭包基础

77 阅读1分钟

作用域、作用域链

  • 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