破解 JavaScript 中的闭包概念

破解 JavaScript 中的闭包概念

简而言之,根据定义,JavaScript 中的闭包是一种允许从内部函数访问外部函数作用域的机制。

让我们看看下面的例子,

功能 在地球上 () 可以访问变量 sunVisibleForYou 在外部词法范围中定义( 大学 功能范围)。这怎么可能?有趣的是,在第 12 行,函数 大学 ()已经执行完了,怎么来的 某人某地在地球上 () (这基本上是 在地球上() 函数)仍然记得的值 sunVisibleForYou ?

好问题!

简短的回答:由于 JavaScript 中的闭包概念,内部函数 在地球上() 包含在其外部环境中定义且执行所需的变量。

还在迷茫吗?没问题。现在,我想带您了解这个示例的执行过程(在幕后),并详细说明其他相关概念。希望它最终对你更有意义。

JavaScript 引擎和执行上下文

当 JavaScript 引擎到达第 11 行并遇到括号时 () ,它为 宇宙() 函数并将其推送到 ** 调用栈** .当函数完成执行时,引擎将执行上下文从堆栈中弹出。

这基本上是在 JavaScript 中调用函数时发生的事情。

词汇环境

JavaScript 引擎分两个阶段创建执行上下文。在第一阶段,它为该特定函数创建了我们所说的词法环境。在第二阶段,它执行函数内的指令并将其从调用堆栈中弹出。

词法环境是一种特定的数据结构,它记录了标识符变量在 ** 堆内存** .换句话说,它记录变量/函数声明及其实际值(可能在运行时更新)。

现在,让我们回到我们的示例,并用图表说明 JavaScript 引擎在第 11 行时的执行状态。

Diagram 01

请注意如何为每个执行上下文创建词法环境并在内存中分配。例如,在这个实际的执行时间(调用 宇宙() 函数),全局 LE 有三个条目, 大学 保存Univers() 函数定义的标识符, 当前地球人口 保持值 7.7 的变量,以及 某人某地在地球上 设置为的标识符 不明确的 .

范围链

您可能已经注意到,在图 01 中, 全球 LE大学 乐。内部函数 大学 () 在全局范围内按词法嵌套(写入)。因此,它可以访问外部(父) 全球 LE , 这是由于机制 范围链 .

由于这个原则,第 11 行打印“ 目前世界人口为7.7 ”。事实上,JavaScript 引擎查找了变量 当前地球人口 首先在Univers LE中,然后因为找不到它,所以它会在父LE中向上查找。

通常,如果嵌套级别比我们的示例中的多,JavaScript 引擎会沿着链向上和向上直到找到它。

重要的是要知道链中的查找是 总是 完毕 ****自下而上,反之亦然。

这解释了为什么您不能从外部访问函数内定义(写入)的变量。

关闭和垃圾收集

在第 12 行,JavaScript 已经完成 宇宙() 功能。结果,它的执行上下文将从调用堆栈中删除,返回值(onEarth() 函数定义)将分配给变量 地球上的某个地方, 并且它的词法环境将被垃圾收集——意味着删除以释放内存。

在执行的这段时间内,我们的图表将发生如下变化……

Diagram 02

在第 12 行,JavaScript 引擎创建 某人SomewhereOnEarth() 乐。它包含两个条目,一个是对外部作用域(全局 LE)的引用,另一个是对闭包的引用。

我有没有说过 大学 LE 会被垃圾回收吗?其实我的意思是差不多!我们仍然需要变量 sunVisibleForYou 执行 某人某地某地 ()。在那里,为它创建了一个闭包,并在其 LE 中添加了对闭包的引用,如图 02 所示。

这就是我们的功能 在地球上 () 记住变量 sunVisibleForYou .这就是我们在 JavaScript 中所说的闭包,一种特殊的函数记忆方式。

就是这样......希望现在,您对 JavaScript 中的闭包有了更好的了解,并且可以向您的朋友解释它——或者您可以与他们分享这个故事?

如果您有任何反馈或问题,请使用评论部分。

祝您愉快 :)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/22126/36080708

posted @   哈哈哈来了啊啊啊  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示