- MDN中对闭包的解释
闭包是一种特殊的对象。
它由两部分组成:函数以及创建该函数的环境。而环境是由闭包创建时在作用域中的任何局部变量组成。
对于这个注解我觉得不太能理解。
- 以下是个人目前对于闭包的一个粗浅认知和疑惑,欢迎各路大神不吝指正、补充!
1. 闭包: 函数内创建函数,称之为父函数与子函数即外部函数与内部函数(也称之为闭包函数),调用父函数去在外部使用子函数这样的一种模式,子函数能够保存和使用父组件内设置的某一种状态下的变量
const fn1 = () => { // 外部函数,即父函数
const arr = [], num = 5;
Array(num).fill(0).map((_, index) => {
arr.push(() => { // 内部函数,即子函数
console.log(index); // 保存着每一个外部函数定义的index变量的值
});
});
return arr;
}
fn1();
**值得注意的是**
fn1函数调用完之后 其函数作用域本该被销毁,即其内部定义的局部变量也会随之被销毁;
由于内部子函数(闭包,闭包调用了外部函数内的变量,使其处于被调用的状态)的存在,导致函数作用域及其内部变量不会被销毁,将保存至闭包函数被销毁为止
2. 有看到一篇博文上说:闭包可以突破作用域链,将函数内部的变量以及方法传递给到外部
这个具体怎么突破呢?这作用域、作用域链又是什么呢?闭包的作用域链包含哪些区域呢
闭包的作用域:
1. 闭包函数作用域;
2. 外部函数作用域(闭包可以访问到外部函数的局部变量)
3. 全局作用域:windows(外部函数在全局作用域下调用)
3. 开发中我们会在什么场景下使用闭包?
主要应用于**封装变量**,**保护变量不受外界污染**
4. 有个疑问哈,能否直接使用块级作用域加上let、const设置变量实现,为什么?
还不太理解。。。
5. 闭包的缺点
# 容易造成内存泄漏
6. 过多的变量保存,导致了产生内存泄漏的性能问题,这些变量为什么不会被销毁呢?
# 这又关乎于浏览器的垃圾回收机制了,怎么办呢,这又是个新概念啊