何为闭包?
这里收集了不同文献中的原话,具体怎么理解看你自己:
《JavaScript 高级程序设计》
闭包指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。
《Node 深入浅出》
在 JavaScript 中,实现外部作用域访问内部作用域中变量的方法叫做闭包(closure)。
《JavaScript 设计模式与开发实践》
局部变量所在的环境被外界访问,这个局部变量就有了不被销毁的理由。这时就产生了一个闭包结构,在闭包中,局部变量的生命被延续了。
《你不知道的 JavaScript(上卷)》
内部的函数持有对一个值的引用,引擎会调用这个函数,而词法作用域在这个过程中保持完整,这就是闭包。换句话说:当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域外执行,这时就产生了闭包。
个人简单解析:一个函数的值被其内部函数所引用,且这个内部函数被外部作用域所访问,就是闭包。 (外部作用域怎么访问到这个内部函数呢,内部函数被return了出去。)
如何解决闭包?
1、放访问内部函数的变量置为null
const a = () => {
const b = 1
const c = () => {
console.log(b)
}
return c
}
let d = a()
---------------------
这里d 长期引用了c,而c一直引用了b,导致变量 b 无法被 gc 回收, 存在内存泄漏
解决办法: d = null
2、使用立即执行函数(这个能理解,但很鸡肋,有了let 以后,它所解决的问题,用let 也能解决,且不好被理解。)
什么是闭包?如何解决闭包?_前端菜鸟小郭的博客-CSDN博客_闭包怎么解决
为啥鸡肋,直接参考这篇文章的代码,用立即执行函数解决了for循环的经典问题,但用const也能解决。