首先说说什么是闭包:
**闭包的概念:**
闭包函数:声明在一个函数中的函数,叫做闭包函数。
闭包:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
举个例子:
function a() {
var num = 100
return function b() {
console.log(num)
}
}
比如当需要延长变量的声明周期的时候
输出 a( )
这个函数
在执行的时候, 会生成一个函数执行空间在这个函数执行空间,里面有一个 num 变量
,等到代码执行完毕, 这个执行空间就销毁了,那么函数里面的私有变量 num
也不存在了。
但是用 var res = a( )
用一个变量保存这个函数
原因是 res
接受的就是 a 函数
内部返回的函数 b , a 函数
的函数执行空间就不会销毁, a 函数
执行空间内部的 num 变量
也不会销毁。
比如当你需要访问函数内部的私有变量的时候
在函数外部直接 console.log(num)
会报错, 没有这个变量
因为 num
是函数 a
的私有变量
`var res = a( )`用一个变量保存这个函数
`res` 接受到的是 `a 函数`内部的`函数 b` , `res( )` 的时候, 执行的一句话就是 `console.log(num)` 当`函数 b` 内部访问 `num 变量`的时候,
如果自己没有就会去 `b 函数`的父级作用域查找 `b 函数`的父级作用域就是 `a函数`的执行空间,里面就有一个 `num 变量`可以被访问就能打印出 100
res( )
闭包有保护私有变量(只要是函数就有这个特点)
在函数外部直接 console.log(num)
会报错, 没有这个变量
因为 num
是函数 a
的私有变量, 除了函数内部可以访问,在函数外部不能访问函数内部的私有变量,保护私有变量不被外部变量冲突或修改
总结一下:闭包的特点有以下三个(优点和缺点并存)
1. 延长了变量的生命周期
优点: 因为执行空间不销毁, 变量也没有销毁
缺点: 因为执行空间不销毁, 它会一直存在在内存中,占用内存
2. 可以访问函数内部的私有变量
优点: 利用闭包函数可以访问函数内部的私有变量
缺点: 执行空间不会销毁, 会一直存在在内存中,占用内存
3. 保护私有变量(只要是函数, 就有这个特点)
优点: 保护私有变量不被外界访问
缺点: 如果向访问, 必须要利用闭包函数
闭包的函数的缺点 **致命**
因为当一段内存空间中有一个不会被销毁的东西一直存在
那么就会出现内存占用, 如果过多, 就会导致内存溢出
那么结果就是 内存泄漏
例子: 内存泄漏
比如说你有一个 盆, 能装 2L 水
你向里面正常导入 2L 水, 是没有问题的
假如这个盆里面被 “闭包” 占据了 0.5L 的空间
你向里面正常导入 2L 水, 那么就会有一部分漏出来了
闭包的作用
就是当你需要延长变量的声明周期的时候
或者你需要访问某一个函数内部的私有数据的时候
你可以使用 闭包 函数来解决
但是有个前提闭包一定要慎用:
如果有别的方法, 尽量不要使用闭包函数
只有到没有招的时候, 我们再使用闭包函数