理解闭包

33 阅读1分钟

什么是闭包

官方解释:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域。(比较晦涩难懂)

通俗解释:内层函数 + 外层函数的变量 + 内层函数引用了外层函数的变量,就构了闭包 闭包可以实现数据私有,在方法内定义的参数,方法外的修改是无效的。

节流和防抖就是常见的闭包,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 本身,所以形成了循环引用。

使用垃圾回收机制的标记清除法,可以溯源查到闭包中的变量被引用,于是就不会被清除,也会造成内存泄漏!