gpt4 book ai didi

javascript - 闭包和 ES2015

转载 作者:行者123 更新时间:2023-11-29 15:32:10 25 4
gpt4 key购买 nike

对于另一个闭包问题,我提前表示歉意,但我想澄清一下我对闭包在 JavaScript 中的实现方式的理解。

考虑以下代码:

01 'use strict';
02 function foo() {}
03 foo();

我已经建立了question今年早些时候,闭包在概念上(如果实际上不是由于引擎优化)在这里创建。

直到第 3 行调用 foo 时,才会创建相应的执行上下文。

据我从规范中得知,在评估这段代码时:

  1. 每个执行上下文都有一个“LexicalEnvironment”组件,用于解析其中的代码对标识符的引用(8.3,表 23)。
  2. FunctionCreate 被调用,将引用(名为“范围”)传递给当前执行上下文的“LexicalEnvironment”组件。 (14.1.19)
  3. FunctionCreate 调用 FunctionInitialize 传递“范围”(9.2.5)
  4. FunctionInitialize 确保正在创建的函数对象的[[Environment]] 内部槽被设置为“作用域”的值(对“LexicalEnvironment”当前执行上下文的组件)(9.2.4)

最后,当实际调用 foo 时,我发现规范更难解释。

  1. PrepareForOrdinaryCall 中,调用的新执行上下文的“LexicalEnvironment”设置为调用 NewFunctionEnvironment (9.2.1.1) 的结果
  2. NewFunctionEnvironment 将对外部执行上下文(函数对象的 [[Environment]] 槽)的“LexicalEnvironment”组件的引用复制到 正在构建的执行上下文的“LexicalEnvironment”组件的环境记录(EnvironmentRecord?)作为“外部词法环境引用”(8.1.2.4)

因此闭包以两步方式实现:

  1. 函数对象和封闭执行上下文的封闭“LexicalEnvironment”之间的链接是在函数对象实例化时创建的。这是函数对象的[[Environment]]内部槽。
  2. 当一个函数被调用时,这个对外部执行上下文的封闭“LexicalEnvironment”组件的引用(函数对象的[[Environment]]槽的内容)被复制到一个spec-imprecisely-defined(?)/EnvironmentRecord(?) 新执行上下文的“LexicalEnvironment”组件的子组件。

这听起来对吗?

最佳答案

Does this sound about right?

差不多。我只是不会使用“复制”的作品,而是“链接”的作品。稍微简化一下:

  1. 创建函数时,它会存储对创建它的环境的引用。
  2. 当函数执行时,这个存储环境成为新建函数环境的“外部环境”。

或者在图片中:

                  +----------------+                     +----------------+
Function | | [[Environment]] | Outer |
creation | Function |-------------------->| Environment |
| | | |
+----------------+ +----------------+
^
|
|
+----------------+ |
Function | Function | outer environment reference |
execution | Environment |------------------------------+
| |
+----------------+

每个 函数都会发生这种情况,并且根据您对闭包的定义1,这会使每个函数成为闭包(或不是)。


1:我相信对于函数作为闭包的含义有以下两种理解:

  • 如果一个函数存储了对其创建环境的引用,那么它就是一个闭包(适用于 JS 中的每个函数)
  • 如果一个函数存储了对它在中创建的环境的引用并“离开”那个环境(环境“不再存在”),它就是一个闭包。当然,情况并非总是如此。

关于javascript - 闭包和 ES2015,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33802718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com