引起您注意的是Parathan Thiyagalingam发表在medium.freecodecamp.org上的一篇文章的译文。 是否想知道JavaScript闭包是如何工作的? 看猫下!
照片奥斯汀· 迪斯泰尔与不飞溅闭包是函数创建时范围内所有变量的组合。 要使用闭包,您需要创建一个嵌套函数,即函数内部的一个函数。 即使在外部函数完成之后,内部函数也可以访问外部函数范围内的变量。 (提供此访问权限的是
闭包 。)每次创建函数时,都会创建闭包。
在开始理解闭包的概念之前,请考虑一下JavaScript中的作用域链。
通常,可见性区域分为两种:全局和局部。
在JavaScript中,无法从外部访问函数内部的变量-例如,与块内的变量不同(例如
if
和
while
)。
基于此,JavaScript中的函数具有作用域,而块没有作用域。
var a = 10; function app(){ var b = 2; console.log(a);
众所周知,
a是全局变量,
b是局部变量,即仅由
app
函数使用。 在本地范围之外,我们无权访问本地变量。
如何使用嵌套函数(函数内部的函数)
var a = 10; function app(){ var b = 2; var d = 3; function add(){ var c = a + b; } return add; } var x = app(); console.dir(x);
在上面的示例中,
app
是父函数,
add
是子函数。
- 使用console.dir代替console.log来显示所选对象的所有属性。
- 变量x被分配给
app
函数,然后该函数返回add
函数。 这使您可以查看add
函数的对象的所有属性。
如果在浏览器中打开控制台,则将在
Scopes
数据数组内找到
Closure
对象。

由于
add
内部函数可以访问属于外部函数的变量
b和
d ,因此这两个变量将作为引用添加到
Closure
对象中。
考虑另一个封闭示例。
var a = 10; var startFunc; function app(){ var b = 2; function add(){ var c = a + b; console.log(c); } startFunc = add(); } app();
- 为
startFunc
全局函数分配了add
函数,它是父函数app
的startFunc
。 - 仅在调用app函数后才有可能。 否则,
startFunc
函数的行为将类似于没有分配值的全局变量。
如何在JavaScript中使用闭包
我们中的许多人在编写代码时都使用闭包,但他们并不完全理解为什么这样做。 JavaScript缺少面向对象编程语言中的
public ,
protected和
private修饰符。 因此,为了阻止对外部代码的命名空间的访问,我们不得不借助函数的帮助。
而且,由于我们在谈论功能-在声明后
立即启动立即
调用的功能(IIFE) 。 她甚至不需要被叫。
IIFE语法如下所示:
(function(){
考虑以下示例:
var studnetEnrollment = (function () {
count
和
prefix
是两个不能更改的私有变量。 仅内部函数(在我们的例子中,这是
innerFunc
函数)才可以访问它们。
- 首次调用
studentEnrollment
函数时, studentEnrollment
函数studentEnrollment
count
变量的值增加到1。 - 第二次,
count
从1增加到2。 - 所有这些只有通过关闭才能实现。
结论
闭包是外部函数的一组变量,因此内部函数的范围可以访问这些变量。 这样可以保护全局名称空间。
闭包功能允许开发人员编写简洁的代码-例如,采用面向对象的编程语言,即不会混淆全局变量和局部变量的代码。
编码不错!