对闭包的理解,什么场景下使用闭包

120 阅读2分钟
  • MDN中对闭包的解释
闭包是一种特殊的对象。
它由两部分组成:函数以及创建该函数的环境。而环境是由闭包创建时在作用域中的任何局部变量组成。

对于这个注解我觉得不太能理解。
  • 以下是个人目前对于闭包的一个粗浅认知和疑惑,欢迎各路大神不吝指正、补充!

1. 闭包: 函数内创建函数,称之为父函数与子函数即外部函数与内部函数(也称之为闭包函数),调用父函数去在外部使用子函数这样的一种模式,子函数能够保存和使用父组件内设置的某一种状态下的变量

    const fn1 = () => { // 外部函数,即父函数
        const arr = [], num = 5;
        Array(num).fill(0).map((_, index) => {
            arr.push(() => { // 内部函数,即子函数
                console.log(index); // 保存着每一个外部函数定义的index变量的值
            });
        });
        return arr;
    }
    fn1();

image.png

**值得注意的是**

fn1函数调用完之后 其函数作用域本该被销毁,即其内部定义的局部变量也会随之被销毁;

由于内部子函数(闭包,闭包调用了外部函数内的变量,使其处于被调用的状态)的存在,导致函数作用域及其内部变量不会被销毁,将保存至闭包函数被销毁为止

2. 有看到一篇博文上说:闭包可以突破作用域链,将函数内部的变量以及方法传递给到外部

这个具体怎么突破呢?这作用域作用域链又是什么呢?闭包的作用域链包含哪些区域呢

闭包的作用域:
1. 闭包函数作用域;
2. 外部函数作用域(闭包可以访问到外部函数的局部变量)
3. 全局作用域:windows(外部函数在全局作用域下调用)

3. 开发中我们会在什么场景下使用闭包?

主要应用于**封装变量****保护变量不受外界污染**

4. 有个疑问哈,能否直接使用块级作用域加上let、const设置变量实现,为什么?

还不太理解。。。

5. 闭包的缺点

# 容易造成内存泄漏

6. 过多的变量保存,导致了产生内存泄漏的性能问题,这些变量为什么不会被销毁呢?

# 这又关乎于浏览器的垃圾回收机制了,怎么办呢,这又是个新概念啊

大神博文:Chrome 浏览器垃圾回收机制与内存泄漏分析