什么是闭包?
在了解闭包之前,我们首先需要搞懂什么是闭包,闭包指的是一个有权访问另一个函数作用域中变量的函数。
为什么需要闭包?
我们知道在JS中,变量分为全局变量和局部变量,全局变量的作用域为全局作用域,局部变量的作用域为局部作用域,我们可以在函数内部访问全局变量,但是无法在全局环境中访问函数的局部变量,闭包可以帮助我们访问到这个局部变量。
闭包的应用场景
场景一:立即执行函数
const a = 666; (function getA(){ console.log(a); })() 复制代码
场景二:模拟块级作用域
for(var i = 0; i < 5; i++) { (function (j) { setTimeout(() => { console.log(j); },1000) })(i) } 复制代码
场景三:封装私有变量
function Person(name) { this.getName = function(){ return name } } 复制代码
闭包解决了什么问题?(闭包的作用)
- 闭包可以缓存上级作用域,使得函数外部打破了函数作用域的束缚,可以访问函数内部的变量。
- 让变量的值始终保持在内存中。
闭包带来了什么问题?(闭包的缺陷)
闭包会导致函数的变量一直保存在内存中,过多的闭包会导致内存泄露。
数组的哪些方法用到了闭包?
- 例如forEach
const arr = [1,2,3]; arr.forEach((item,index) => { setTimeout(() => { console.log(item); },1000) }) 复制代码
只要是符合闭包的定义,一个有权访问另一个函数作用域中变量的函数就是闭包。权威指南中说,严格意义来说JS中的函数都是闭包。