什么是闭包?
MDN给出的官方回答是“闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量

看代码

//一个函数里面包含了另一个函数,最后已返回值返回被包裹的的函数。function func() {    let a = 1;    function closer(){        console.log(a)    }    return closer}let b = func()b() // 1

按照正常的js作用域,当func执行完后a已经被销毁,但是变量b仍然能够访问到它里面的变量。
这就是闭包的核心。当函数执行完后,被作为返回值函数保留在了作用域中。以至于里面的数据没有被销毁,仍然可以访问到。
闭包还有一个作用是模拟私有方法和变量。要知道,js是不支持定义私有方法和变量的。
通过这个类作为对象返回私有方法和属性,便可以保证它们只可以被Create所调用。

function Create(){   var privateCounter = 0;   function changeBy(val) {     privateCounter += val;   }   return {        increment: function() {          changeBy(1);        },        decrement: function() {          changeBy(-1);        },        value: function() {          return privateCounter;        }    }   }

闭包的缺点
由上文可知闭包的作用可以使数据保存在内存中。当滥用闭包,也会导致内存占用过多,影响性能

解决闭包的问题
当你已经确定某些数据不会再被调用时,可以把闭包删除或者设为null

总结
当一个函数能够记住并访问到其所在的词法作用域及作用域链,特别强调是在其定义的作用域外进行的访问,此时该函数和其上层执行上下文共同构成闭包