# 闭包的使用场景?

闭包很简单,就是能够访问另一个函数作用域变量的函数,更简单的说,闭包就是函数,只不过是声明在其它函数内部而已。

function getOuter(){
  let count = 0
  function getCount(num){
    count += num
    console.log(count) //访问外部的数据
  }
  return getCount //外部函数返回
}
var myfunc = getOuter()
myfunc(1) // 1
myfunc(2) // 3

闭包的特点:

  • 闭包可以访问当前函数以外的变量
  • 即使外部函数已经返回,闭包仍能访问外部函数定义的变量与参数
  • 闭包可以更新外部变量的值

所以,闭包可以:

  • 避免全局变量的污染
  • 能够读取函数内部的变量
  • 可以在内存中维护一个变量

使用闭包应该注意什么:

  • 代码难以维护: 闭包内部是可以访问上级作用域,改变上级作用域的私有变量,我们使用的使用一定要小心,不要随便改变上级作用域私有变量的值
  • 使用闭包的注意点: 由于闭包会使得函数中的变量都保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除(引用设置为 null ,这样就解除了对这个变量的引用,其引用计数也会减少,从而确保其内存可以在适当的时机回收)
  • 内存泄漏: 程序的运行需要内存。对于持续运行的服务进程,必须及时释放不再用到的内存,否则占用越来越高,轻则影响系统性能,重则导致进程崩溃。不再用到的内存,没有及时释放,就叫做内存泄漏
  • this指向: 闭包的this指向的是window

闭包的使用场景详见:https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/453