【前言】JavaScript中的闭包函数在面试中出现的频率很高,在本文中,我们将讨论 JavaScript 中的闭包。我将带您了解闭包的定义、一个简单的日常获取实用程序闭包示例,以及使用闭包的一些优点和缺点。
什么是闭包
定义:闭包是可以访问其作用域链中存在的变量的函数,即使外部函数不再存在。
为了能更详细地理解这一点,让我们了解一下作用域链是什么。作用域链是指父作用域无法访问其子作用域内的变量,但子作用域确实可以访问其父作用域中存在的变量。
让我们看一下示例:
let a = (res) => {
const b = (err1, err2) => {
const c = {
res,
err1,
err2
};
return c;
}
return b;
}
如上示例,我们定义一个名为a的函数。此函数接收res作为参数。让我们将该a函数视为我们的父函数。我们在父函数内部定义了另一个函数,即函数b,此函数将接收err1和err2作为参数并返回一个对象,该对象构成res其范围之外的变量。但是出现了一个问题,即内部函数如何解析父作用域中存在的变量。这可以通过词法作用域来实现。使用词法作用域,JS 解析器知道如何解析当前作用域中存在的变量,或者实际上知道如何解析嵌套函数中存在的变量。因此,根据上述解释,函数b将可以访问其外部函数中存在的变量a。
在上面的例子中,内部函数b是一个闭包。要详细了解闭包,我们将首先了解闭包的特征,如下所示:
- 即使外部函数不复存在,闭包仍然可以访问其父变量。
- 闭包无法访问其外部函数的args参数。
闭包的优点
- 它们允许您将变量附加到执行上下文。
- 闭包中的变量可以帮助您保持以后可以使用的状态。
- 它们提供数据封装。
- 它们有助于删除冗余代码。
- 它们有助于维护模块化代码。
闭包的缺点
- 在闭包内声明的变量不会被垃圾回收。
- 过多的闭包会减慢您的应用程序。这实际上是由于内存中的代码重复造成的。
【结语】如果您想处理或实现某些设计模式,通过这种方式闭包会非常有用。它们还可以帮助您编写整洁和模块化的代码,希望本文能给您带来帮助。