一、什么是闭包?
——官方解释:
一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域
——简单解释:
👉 闭包=内层函数可以引用的外层函数的变量
——闭包优势
可以保护内部变量,不让外部进行修改,实现数据的私有
简单案例如下:
test(){
var a=1
function fn(){
console.log(a)
}
fn()
}
test()
二、闭包注意点
1.闭包一定有return吗?
答案是否定的,像我们上面的案例便没有使用。
2.什么时候用到return?
外部如果想使用闭包的变量,则需要return
test(){
var a=1
return function(){
console.log(a)
}
}
const fn=test()
fn()
3.闭包的使用场景
现在我们想统计调用函数的次数。
普通写法:
var a=0
function(){
a++
console.log(`函数调用次数为${a}`)
}
但是这样写有一个问题,当我们改变外部变量例如,令a=100,调用次数就会被影响,导致数据混乱,怎么才能不让外面修改的数值影响内部运行,就可以采用闭包的方式:
function test(){
var a=0
a++
return function(){
console.log(`函数调用次数为${a}`)
}
}
const fn=test()
fn()
4.闭包内存泄漏
分析如何造成内存泄漏:
1、result 是一个全局变量,代码执行完毕不会立即销毁
2、result 使用fn函数
3、fn用到 fun 函数
4、fun 函数里面用到 count
5、count 被引用就不会被回收,所以一直存在