闭包是有权限访问其他函数作用域的局部变量的一个函数
代码
function outer(){
const a=1;
function f(){
console.log(a)
}
f()
}
outer()
简单来说:闭包=内层函数+引用的外层函数变量
为什么要使用闭包?
用此方法可以来统计函数调用次数, 但是如果i这个变量被修改了则会影响到这个统计结果
let i=0;
function fn(){
i++;
console.log(`函数被调用了${i}次`)
}
最好的方法就是把变量变成函数的私有变量,防止外部修改
function count(){
let i=0;
function fn(){
i++;
console.log(`函数被调用了${i}次`)
}
return fn;
}
const fun=count()
闭包一定有return吗?
答:不一定,外部如果想要使用闭包的变量,此时则需要return
function outer(){
const a=1;
return function f(){
console.log(a)
}
f()
}
const fn=outer();
fn()
闭包一定会引起内存泄漏吗?
答:闭包可能引起内存泄漏,如下代码所示,i可能引起内存泄漏
function count(){
let i=0;
function fn(){
i++;
console.log(`函数被调用了${i}次`)
}
return fn;
}
const fun=count()
fun()
fun()
1.fun是一个全局变量,代码执行完毕不会立即销毁
2.fun使用count函数
3.count函数使用fn函数
4.fun函数里面用到count
5.count被引用就不会被回收,所以一直存在
此时:闭包引起了内存泄漏
注意:
1. 不是所有内存泄漏都要手动回收
2. 比如react里面很多闭包不能回收的