💡 前言:闭包每次面试都问,每次看完就忘,从来没有真正理解,今天我倒要嚼碎了看看
一、闭包的概念
通俗来讲就是函数包函数,内层函数访问到外层函数作用域就形成了闭包
简单理解:闭包 = 内层函数 + 引用的外层函数变量
我们打个断点发现,scope中的closure就是闭包
二、什么是作用域以及作用域链
作用域:限制变量可以被访问的环境
作用域链:子函数可以访问上层函数的变量,当找不到当前作用域下的变量的时候就会一直往上查找直到全局作用域,这个一层一层往上找的过程被称作作用域链
1、全局作用域:整个页面都可以访问到
2、函数作用域:当定义一个函数的时候,函数内部的变量只能在内部访问,在外部访问就会报错
3、块级作用域(ES6新加的)
必须要用let声明变量才行,如果用var声明变量就不会有这个问题
三、闭包的使用
看下面这个方法,我们定义了一个普通的函数,然后在控制台进行调用,发现如果我们中途去修改这个变量i之后我们打印出来的调用次数就会随着改变后的值递增,这是因为i是一个全局变量,可以被直接修改
如果我们使用闭包的话,看如下代码,我们在外部去修改变量i,其实并不会影响内部函数,因为这个变量i是私有的,所以这就解决了闭包的应用,外层可以使用这个变量,但是不能修改这个变量,因为这个变量是属于内部变量的,这就实现了数据的私有。
四、闭包-内存泄漏(补充)
五、闭包使用场景
防抖节流,reacthooks等