一、闭包的概念
闭包: 函数内部的函数
闭包的生成有三个必要条件(缺一不可):
1、在函数A内部直接或间接返回一个函数B
2、B函数内部使用A函数的私有变量(函数内的局部变量)
3、A函数外部有一个变量接受函数B
然后就形成了一个不会销毁的函数空间
我们管这个不会销毁的A函数的执行空间叫闭包;把函数A里面返回的函数B,叫做函数A的闭包函数
function a() {
let num = 100
return function b() {
console.log(num)
}
}
let res = a()
res随时可以被调用
在执行空间里 函数a里面的一切都不会被销毁
当res调用的时候,打印的是私有变量num的值
二、闭包的特点
1、延长了变量的生命周期
优点:因为执行空间不会销毁,变量也没有销毁
缺点:因为执行空间不会销毁,所以变量一直存在内存中
2、可以访问函数内部的私有变量
优点:利用闭包函数可以访问函数内部的私有变量
缺点:因为执行空间不会销毁,所以变量一直存在内存中
闭包函数的缺点是:“致命的”
因为当一段内存中有一个不能被销毁的东西一直存在的时候
那么就会出现内存占用,如果过多的占用内存,就会导致内存溢出
也就是内存泄漏
什么是内存泄漏
例子:
我有一个桶,能装10L的水
我正常倒入10L的水,没有任何问题
如果这个桶里有一个闭包,闭包永久的占用了我1L空间
我再往里到10L的水,一定有一部分漏出来了
所以闭包要慎用
记得用完闭包后 把承接闭包的变量的值改变成null
function a() {
let num = 100
return function b() {
console.log(num)
}
}
let res = a()
res = null
闭包的作用:
就是当需要延长变量的生命周期的时候
或者需要访问某一个函数内部的私有变量的时候
我就可以使用闭包来解决问题
前提
如果有别的办法,优先使用别的办法
没别的办法了,就用闭包