gpt4 book ai didi

javascript - JavaScript 闭包中的激活对象

转载 作者:行者123 更新时间:2023-11-30 05:36:31 25 4
gpt4 key购买 nike

我试图弄清楚闭包是如何在 JS 中实现的(理论上),有一件事让我感到困惑,我找不到答案。

JS 中的闭包使用一系列激活对象。每个函数调用都有一个,它指向其父级的 Activation Object,后者指向父级的 Activation Object,依此类推。

如果我没理解错的话,本例中的“父”是在其中定义子函数的函数调用。

但是 child 如何知道其 parent 的激活对象呢?子函数可以在程序的任何地方调用,甚至可以在定义它的函数调用之外调用。定义函数时,父对象的激活对象是否以某种方式存储在函数对象本身中?是否每个函数调用都以某种方式从它自己的函数对象中获取其父对象的激活对象?这是我能想到的唯一解释,但我无法证实。

此外,是否有一种方法可以检查激活对象(很像如何检查 __proto__)?

最佳答案

至少按照 ECMA 的术语,您所描述的内容定义为 Lexical Environment .

A Lexical Environment consists of an Environment Record and a possibly null reference to an outer Lexical Environment.

并且每个函数 都被定义为具有一个internal [[Scope]] property。 (引用:表 9),它引用了这样一个环境。

Function.[[Scope]] ->
LexicalEnvironment.Outer ->
LexicalEnvironment
# etc.

这里的 .Outer 属性只是一个猜测,但是无论引擎如何引用外部环境,它的值都是当前上下文环境的值 -- [[Scope] ] 周围的 functionprogram 本身。

当调用函数并引用变量时,引擎可以遍历环境及其记录的“作用域链”,直到找到被引用的名称或用完环境并抛出 ReferenceError


Also, is there a way to inspect an Activation Object (much like how __proto__ can be inspected)?

目前在语言本身内是不可能的。无法在 JavaScript 中直接访问内部属性,并且 [[Scope]] 属性没有任何东西可以公开它,就像 [[Prototype]] 属性有 Object.getPrototypeOf()__proto__

但是,正如 Bergi 提到的,JavaScript 调试器可能允许您检查作用域链。例如,under "Scope Variables" in Chrome's Web Tools :

"Scope Variables" in Chrome Web Tools
(source: google.com)

While a script is paused, you can see the current call stack and in-scope variables in the right-hand side bar.

关于javascript - JavaScript 闭包中的激活对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23473581/

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