什么是闭包
官方解释:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域。(比较晦涩难懂)
通俗解释:内层函数 + 外层函数的变量 + 内层函数引用了外层函数的变量,就构了闭包
闭包可以实现数据私有,在方法内定义的参数,方法外的修改是无效的。
节流和防抖就是常见的闭包,vue的方法,react的hooks等,也大量的使用了闭包。
1、闭包一定会有return返回吗?
function outer(){
const a = 1
function inner(){
console.log(a)
}
inner()
}
outer()
以上代码形成了闭包,但是没有return。
function outer(){
const a = 1
return function inner(){
console.log(a)
}
}
const fn = outer()
fn()
外部如果想要使用闭包的变量,则此时则需要 return。
2、闭包一定会有内存泄露吗?
no!
闭包的内存泄漏常常是由于循环引用造成,全局函数或者引用也会引起内存泄漏
function outer() {
let obj = {};
let inner = function() {
return obj;
}
obj.inner = inner; // 这里形成了循环引用
return inner;
}
let fn = outer();
fn = null; // 释放闭包
在上面的例子中,outer 函数返回了 inner 函数作为闭包,而 inner 函数又返回了 obj 对象。由于 obj 对象引用了 inner 函数,而 inner 函数又引用了 obj 本身,所以形成了循环引用。
使用垃圾回收机制的标记清除法,可以溯源查到闭包中的变量被引用,于是就不会被清除,也会造成内存泄漏!