一.什么是闭包
- 定义:当一个函数可以访问到其它函数局部声明变量的函数,就是闭包。
- 举个例子有一个函数,它的属性一般情况我们访问不到,这涉及到函数作用域。
- 而闭包就是在这个函数内部再次声明一个函数,这个函数基于作用域的查询访问的到它上面函数的私有变量,我们将这个访问函数返回回去,那么我们就可以通过这个返回函数访问到变量,这就是闭包。
二.模块闭包
-
定义:为了创建必须调用一个包装的函数,并且返回一个包装函数私有的功能函数
function people(name) { function SayMyName() { console.log(name); } return { SayMyName, }; } let xiaoming = people("xiaoming"); xiaoming.SayMyName();
-
在这个函数里面我们返回了一个函数SayMyName,使其打印出其内部的属性,相当于最简单的模块化方式。
三.闭包使用的场景
fetch("地址").then((response) => {
function dispose() {
return response.sort();
}
let sortResult = dispose();
});
- 在上面的代码中发送了一个网络请求,我们在其请求成功的函数里面声明了一个函数dispose用于处理请求返回的结果,在dispose我们访问到了不在他这个作用域里面的变量response,这就是一个闭包。
- 当然像上面的场景还有很多,比如说定时器在一个点击事件里面你执行了一个定时器,在定时器执行结束以后你将某些属性比如说是元素上面的属性,传递给了另一个函数,这个函数去执行下面的操作 这也是个闭包,因为访问到了不属于他的属性。
- 场景还有很多,比如说在定时器、事件监听器、 Ajax 请求。
四.内存泄漏
回忆一下垃圾回收机制,js会去寻找你用不到的变量,去在内存中删除他,但是闭包传递的是什么,数据的引用对不对,你闭包处理数据或是别的什么一直都在使用他,js没办法删除他,当我们的代码这样的情况多次发生我们的内存是不是一直都得不到解放,这会导致内存占用的升高,甚至进程崩溃。