【发布时间】:2018-08-08 13:36:03
【问题描述】:
我正在阅读Secrets of the Javascript Ninja 并试图找出函数的闭包变量的存储位置。[[Environment]] 函数标识符上可用的属性:
每当创建一个函数时,都会引用它所在的词法环境 创建的函数存储在内部(意味着您无法访问或操作它 直接)名为 [[Environment]] 的属性(这是我们将用来标记这些的符号 内部属性)。在我们的例子中,skulk 函数将保持对全局的引用 环境,以及对 skulk 环境的报告功能。
我在函数中看到的只是[[Scopes]],其中包含闭包范围:
我有两个问题:
-
[[Environment]]是 Node.js 的东西,相当于前端的[[Scopes]]? - 这是检查函数的任何闭包数据的最佳位置吗?
【问题讨论】:
-
1) 这可能是特定于浏览器的。例如,IE 甚至不显示这些范围。但是由于 chrome 中的这个 [[Scopes]] 对象符合 [[enviroment]] 的描述,我会假设它们是相同的并且 [[Scopes]] 是 Chrome 实现。 2) 不知道,我从来没有遇到过这样的情况:检查函数的封闭变量的存储位置比检查封闭变量的值更重要。
-
规范文本中描述的
[[environment]]是一个链表。屏幕截图中的[[scopes]]看起来更像一个数组。 -
正如你的书所说,它不是一个属性。这是一个internal slot(以前称为internal property)。您无法访问它,也无法在函数上“检查闭包数据”。这只是您的调试器的礼貌,使其可供检查。
-
@Bergi 你从哪里得到规格列表?
-
@VSO ecma-international.org/ecma-262。不过,我不能向初学者推荐它
标签: javascript closures