闭包

闭包是什么

红宝书中的定义是:闭包就是有权访问另一个函数作用域中变量的函数。

形成闭包的原因

内部的函数存在外部作用域的引用就会导致闭包。

var a=1;
function fn1(){
  var b=2;
  function fn2(){
    console.log(a,b);
  }
}

这里fn2函数中就存在外部作用域的引用,所以就会产生闭包。

闭包变量存储的位置

闭包中的变量存储位置是推内存。

闭包的作用

  1. 保护函数的私有变量不受外部的干扰。形成不被销毁的内存。

  2. 把一些函数内的值保存下来。闭包可以实现方法和属性私有化。

闭包需要注意什么

闭包容易导致内存泄漏,闭包会携带其他函数的作用域,因此会比其他函数占用更多内存。过度使用闭包会导致内存占用过多。

检查内存泄漏

我们先来检测没有闭包的情况

let a = 1;

内存无泄漏监听
我们看到堆内存在上升后又释放了。我们再来检测一下闭包的情况。

function fn(){
  let a = 1;
  return ()=>{
    console.log(a);
  }
}
let f = fn();
f();

内存泄漏监听
上图可以看出堆内存中的占用一直存在。