即函数定义和函表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。
再简单点也就是说, 在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量可以在函数外部读取函数内部的变量
闭包创建
fun1(){
var list = [1,2,3,4,6]
return function fun2(){
console.log(list)
}
}
buttonClick(){
var fun=this.fun1()
fun()
}
优点
保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突即属性私有化
在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
匿名自执行函数可以减少内存消耗
缺点
加大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响