回归基础 - JavaScript 闭包

2025-06-10

回归基础 - JavaScript 闭包

我的 JavaScript 基础系列第二部分来了!本周我们将回顾闭包。我想很多初学者可能都理解这个概念,但可能没有意识到我们把这个功能称为闭包。让我们深入探讨闭包的定义,并探索一些示例。

MDN将闭包定义为“函数及其声明的词法环境的组合”。这很好……但我们能否更简化,用通俗易懂的语言来解释呢?

可以将闭包视为一个带有保留数据的函数。保留数据包括函数调用时作用域内的所有变量或参数。每个函数调用都会创建自己的保留数据,我们称之为局部绑定 (local binding)。我们可以访问局部绑定的特定实例,这就是闭包的由来。

让我们看一些例子:

下面的代码展示了外部函数和内部函数。外部函数接受一个数字,将其赋值给局部变量 ( local ),并返回内部函数。内部函数计算并返回局部变量的值乘以 2。

简单的外部/内部函数闭包示例
演示多个本地绑定(闭包)

如前所述,每次调用函数时都会创建一个新的本地绑定。因此,单个函数可以具有多个本地绑定,如上面的代码所示。我们有一个闭包访问 的绑定num = 2,还有一个闭包访问 的绑定。我们还可以在程序中的任何地方num = 4调用var1()和,并且它们将保留各自的本地绑定。var2()

下一个示例稍微复杂一些。它同时考虑了外部函数和内部函数,但这次内部函数接受一个参数。这段代码的目标是构建一个 DRY 函数,用于创建乘法的蓝图。我们可以将此函数绑定到一个因子(例如 5),然后通过传入不同的数字反复使用。

更复杂的外部/内部函数闭包示例
函数查看创建它的绑定,而不是调用它的绑定

上面我们在第 7 行和第 10 行创建了两个独立的环境。triple构造了一个环境,其中factor = 3和 的quadruple作用相同,其中factor = 4。现在看第 13 行,调用 返回的函数triple(5)会调用factor = 3,并识别出 的参数代表5。因此,返回num的结果。num * factor

希望本文能帮助您更好地理解闭包的含义。欢迎在下方留言,分享你的反馈、使用闭包的示例,或者任何其他技巧!

来自朋友的结束 gif

鏂囩珷鏉ユ簮锛�https://dev.to/mollynem/back-to-basics-javascript-closures-17bh
PREV
面向开发人员的 10 款最佳扩展
NEXT
您的励志名言是什么?