js设计模式-闭包

207 阅读2分钟

变量的作用域

变量的作用域,即变量的有效范围。

  • 当变量前面没有带上关键字var,该变量就会成为全局变量
  • 如果是用var声明的变量,这个变量就是局部变量,只有在当前作用域才能访问
  • 当前作用域没有找到该变量时,就会随着代码执行环境创建的作用域链往外层逐层搜索,一直搜索到全局对象为止

变量的生存周期

  • 全局变量的生存周期是永久的,除非我们主动销毁这个全局变量
  • 函数内用var关键字声明的局部变量,当退出函数时,这些局部变量就会随着函数调用的结束而被销毁
  • 但当局部变量被函数内部返回的函数所引用时,这样就形成了闭包,这样即使函数调用结束,但由于内部返回函数可以访问到该局部变量,那么这个局部变量就不会被销毁
const func = function() {
  let a = 1;
  return function() {
    a++
    return a
  }
}
const f = func();
console.log(f()); // 2
console.log(f()); // 3

闭包的作用

  • 封装变量:可以帮助把一些不需要暴露在全局的变量封装成私有变量
  • 延续局部变量的寿命

闭包与内存管理

  • 如果局部变量被封闭在闭包形成的环境中,那么这个局部变量就能一直生存下去,这些变量在闭包中和放在全局作用域,对内存方面的影响是一致的,如果需要回收,手动将变量置为null即可。
  • 闭包容易造成内存泄漏的主要原因是,使用闭包的同时比较容易形成循环引用,如果两个对象之间形成了循环引用,那么这两个对象都无法被回收。如果闭包的作用域链中保存着一些DOM节点,就有可能造成内存泄漏。