闭包的理解

问题:

  1. 什么是闭包
  2. 为什么需要闭包
  3. 闭包的优点和缺点
  4. 什么时候使用闭包
  5. 如何解决闭包造成的内存溢出

参考文档:

什么是闭包

在代码中变量分为:全局变量和局部变量。

在 js 运行环境中存在链式作用域,即子对象会一级级往上获取父对象作用域的变量。所以所有父对象的变量,子对象都可以访问,但是反之则不行。

但是有时候我们需要在外部获取函数内的局部变量,所以就出现了闭包。

闭包:从内部函数可以访问外部函数作用域的函数

闭包是由函数以及创建该函数的词法环境组成而形成。这个环境包含了这个闭包创建时所能访问的所有局部变量。

代码模板如下:

1
2
3
4
5
function outer() {
function inner() {}

return inner();
}

inner 内可以访问 outer 内定义的所有变量,但是 outer 外部无法访问。

闭包的作用

优点

  1. 保护变量不受外界影响 — 在作用域内添加一个私有变量
  2. 使函数可以访问其他函数的变量 — 在函数执行环境中,添加一个公有变量
  3. 保护变量不被回收 — 公有变量长期保存在内存中,不会被销毁

缺点

由于引用变量不被释放,会形成一个不被销毁的作用域,导致内存溢出

闭包的使用场景

  1. 在函数中添加一个共享变量,但是这个变量不被外界所影响。
  2. 使用闭包实现对象的私有变量和私有方法。

如何解决闭包造成的内存溢出

  1. 在闭包使用完毕之后,切断引用变量的使用,可以将引用的变量设置为 null
  2. 避免变量的循环赋值和引用
0%