闭包的理解

问题:

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

参考文档:

什么是闭包

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

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

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

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

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

代码模板如下:

function outer() {
  function inner() {}

  return inner();
}

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

闭包的作用

优点

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

缺点

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

闭包的使用场景

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

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

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

 上一篇
单表sql优化实战 单表sql优化实战
简介模拟sql执行,根据返回结果分析和优化,从而提升sql执行效率。 注意的点: 复合索引的创建顺序和使用顺序需要一致 在范围查询中,如果使用了in ,则可能会导致索引失效 根据sql执行顺序,合理创建复合索引,使之满足第一个条件 正常将
2020-02-26
下一篇 
性能优化之火焰图 性能优化之火焰图
文章你所能了解的内容: 如何定位影响系统性能瓶颈的问题 什么是火焰图 火焰图的 X,Y 轴所表达的信息是什么 如何根据火焰图,分析定位问题 如何生成火焰图 参考文章: https://clinicjs.org/documentatio
2019-10-12
  目录