闭包笔记 | 青训营笔记

70 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

闭包

如何产生闭包:当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包

闭包是什么:①闭包是嵌套的内部函数②包含被引用变量(函数)的对象

产生闭包的条件:
  1. 函数嵌套
  2. 内部函数引用了外部函数的数据(变量/函数)

注意: 闭包存在于嵌套的内部函数中

闭包的作用:
  1. 使用函数内部的变量。让变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期)

  2. 让函数外部可以操作到函数内部的数据

    定义JS模块,将所有的数据和功能都封装在一个函数内部(私有的),只向外暴露一个包含n个方法的对象或函数,模块的使用者, 只需要通过模块暴露的对象调用方法来实现对应的功能

闭包的生命周期:
  • 产生: 在嵌套内部函数定义执行完时就产生了(不是在调用)
  • 死亡: 在嵌套的内部函数成为垃圾对象时
function fn1() {
  //此时闭包就已经产生了(函数提升, 内部函数对象已经创建了)
  var a = 2
  function fn2 () {
    a++
    console.log(a)
  }
  return fn2
}
var f = fn1()
f() // 3
f() // 4
f = null //闭包死亡(包含闭包的函数对象成为垃圾对象)
闭包的缺点与解决:

缺点:函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长,容易造成内存泄露

解决:能不用闭包就不用、及时释放。MDN:如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响