一、什么是闭包
定义:一个函数和对其周围的状态(词法环境)的引用捆绑在一起,这样的组合称为闭包;(mdn)
在js中,一个函数被创建的同时闭包也被创建了。(mdn)
闭包:
function fnOut (){
let a = 1;
function fnIn() {
console.log(a++)
}
return fnIn
}
const fn1 = fnOut()
const fn2 = fnOut()
fn1() // 1
fn1() // 2
fn2() // 1
// 两次调用fnOut,创建了两个闭包,绑定了不同周围环境的引用,所以fn1和fn2的状态互不影响
二、闭包的作用
作用:
1、闭包可以让内部函数访问外部函数的作用域 。(mdn)
2、可以长久的保存一个局部变量
三、闭包会造成内存泄漏吗?
某些情况下会:比如使用了setInterval没有clear时,或者错误的创建了多个定时器,但只清除了最后一个定时器就会造成内存泄漏(内存泄漏:)
四、如何销毁闭包
只要不再保存这个函数的引用了,这个函数和函数所形成的闭包也就会被一并销毁 当状态不再被使用时,js会自动回收,比如使用了setTimeout设定的时间过了之后; 当使用setInterval,则会一直保持引用状态,需要手动清除定时器 ...
五、闭包一定是函数嵌套或一定要return内部函数吗
不一定,函数嵌套是实现闭包的一种常用方式;return内部函数是为了最外部作用域能够调用内部函数,并非闭包生成的必要条件
以下同样是闭包,未函数嵌套、未返回函数:
if (true){
const a = 1;
function fnIn() {
console.log(a)
}
setTimeout(fnIn, 10000)
}
参考文献:developer.mozilla.org/zh-CN/docs/… www.mk2048.com/answer/answ…