闭包

141 阅读1分钟
  1. 垃圾回收机制分为标记清除和引用计数,标记清除指局部变量在函数执行完毕后会清除,引用计数指标记局部变量的引用次数,为0时清除变量。
  2. 作用域分为全局作用域和局部作用域,全局作用域一直存在,局部作用域在js执行到当前函数时其内部定义的变量。
  3. 作用域的变量可以由内往外,不能由外往内。意思是局部函数中用到的变量如果在当前执行环境没有定义,会去上级执行环境找,直到找到window,类似原型链。全局中使用某些变量如果没有声明,不会去其他执行环境查找,只会在全局作用域查找。
  4. 全局变量不会被垃圾回收,函数内部的变量在函数执行完毕后会被垃圾回收,闭包就是函数嵌套函数,内部函数引用外部函数的变量。
  5. 闭包的意义就是函数执行完毕后变量没有被引用会被垃圾回收,通过内部函数引用外部函数变量的方法保持外部函数的变量一直处于引用状态,所以不会被垃圾回收。常见的防抖节流,还有for循环通过函数自执行的方式把i变量一直处于引用状态,i的值就是一直处于引用状态,里面的异步方法拿到的i就是正确的。用let定义i以后会有三个执行环境,因为let定义的是局部变量,内部有引用状态,所以用let拿到i的值也是正确的。