回归基础 - 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
希望本文能帮助您更好地理解闭包的含义。欢迎在下方留言,分享你的反馈、使用闭包的示例,或者任何其他技巧!
鏂囩珷鏉ユ簮锛�https://dev.to/mollynem/back-to-basics-javascript-closures-17bh