Debugger.Environment¶
Debugger.Environment
实例表示一个词法环境,将名称与变量关联起来。每个表示调试目标帧的 Debugger.Frame 实例都有一个关联的环境对象,描述该帧范围内有效的变量;并且每个表示调试目标函数的 Debugger.Object 实例都有一个环境对象,表示该函数闭包包含的环境。
ECMAScript 环境形成一棵树,其中每个局部环境都由其封闭环境(在 ECMAScript 术语中,其“外部”环境)作为父级。我们说一个环境绑定一个标识符,如果该环境本身将标识符与一个变量关联起来,独立于其外部环境。我们说一个标识符在一个环境中在范围内,如果该标识符在该环境或任何封闭环境中被绑定。
SpiderMonkey 根据需要创建 Debugger.Environment
实例,因为调试器检查堆栈帧和函数对象;调用 Debugger.Environment
作为函数或构造函数会引发 TypeError
异常。
SpiderMonkey 为通过给定 Debugger 实例呈现的每个环境只创建一个 Debugger.Environment
实例:如果调试器通过两种不同的方式遇到同一个环境(也许两个函数闭包包含了同一个环境),SpiderMonkey 每次都会向调试器呈现同一个 Debugger.Environment
实例。这意味着调试器可以使用 ==
运算符来识别两个 Debugger.Environment
实例何时引用调试目标中的同一个环境,并在 Debugger.Environment
实例上放置自己的属性以存储有关特定环境的元数据。
(如果多个 Debugger 实例正在调试相同的代码,则每个 Debugger 为给定环境获取一个单独的 Debugger.Environment
实例。这允许使用每个 Debugger 实例的代码在其自己的 Debugger.Object 实例上放置任何它喜欢的属性,而无需担心干扰其他调试器。)
如果 Debugger.Environment
实例的引用不是调试目标环境,则尝试访问其属性(除了 inspectable
)或调用其任何方法都会抛出一个 Error
实例。
Debugger.Environment
实例保护其引用免受垃圾回收器的影响;只要 Debugger.Environment
实例处于活动状态,其引用就会保持活动状态。垃圾回收对 Debugger.Environment
实例没有可见的影响。
Debugger.Environment 原型对象的访问器属性¶
Debugger.Environment
实例从其原型继承以下访问器属性
inspectable
如果此环境是调试目标环境,并且因此可以被检查,则为真。否则为假。如果应用于不可检查的环境,则
Debugger.Environment
实例的所有其他属性和方法都会抛出异常。
type
此环境对象的类型,以下值之一
“declarative”,表示环境是声明性环境记录。函数调用、对
eval
、let
块、catch
块等的调用会创建声明性环境记录。“object”,表示环境的绑定是对象的属性。全局对象和 DOM 元素通过对象环境出现在环境链中。(请注意,
with
语句有自己的环境类型。)“with”,表示环境是由
with
语句引入的。
parent
封闭此环境的环境(在 ECMAScript 术语中为“外部”环境),如果这是最外层环境,则为
null
。
object
一个 Debugger.Object 实例,引用此环境反映其属性的对象。如果这是一个声明性环境记录,则此访问器会抛出一个
TypeError
(因为声明性环境记录没有这样的对象)。"object"
和"with"
环境都具有object
属性,这些属性提供其将属性反映为变量绑定 的对象。
callee
如果此环境表示对函数 f 的调用的变量环境(函数内的顶级环境,接收
var
定义),则此属性的值是一个 Debugger.Object 实例,引用 f。否则,此属性的值为null
。
optimizedOut
如果此环境被优化掉,则为真。否则为假。例如,其局部变量从未被别名化的函数可能会呈现被优化掉的环境。如果为真,则
getVariable
返回一个普通 JavaScript 对象,其optimizedOut
属性在所有绑定上都为真,而setVariable
则抛出一个ReferenceError
。
Debugger.Environment 原型对象的函数属性¶
以下描述的方法只能使用引用 Debugger.Environment
实例的 this
值来调用;它们不能用作其他类型对象的 方法。
names()
返回一个字符串数组,给出此环境绑定的标识符的名称。结果不包括封闭环境绑定的标识符的名称。
getVariable(*name*)
返回在此环境中绑定到 name 的变量的值,如果此环境未绑定 name,则返回
undefined
。Name 必须是一个字符串,它是有效的 ECMAScript 标识符名称。结果是调试目标值。JavaScript 引擎通常会从环境中省略变量,以节省空间并减少执行时间。如果给定的变量应该在范围内,但
getVariable
无法生成其值,则它返回一个普通 JavaScript 对象(而不是 Debugger.Object 实例),其optimizedOut
属性为true
。这不是一个 调用函数;如果此调用会导致调试目标代码运行(例如,因为环境是
"with"
环境,并且 name 引用with
语句的操作数的访问器属性),则此调用会抛出一个Debugger.DebuggeeWouldRun
异常。
setVariable(*name*,*value*)
将 value 存储为此环境中绑定到 name 的变量的值。Name 必须是一个字符串,它是有效的 ECMAScript 标识符名称;value 必须是调试目标值。
如果此环境未绑定名为 name 的变量,则抛出一个
ReferenceError
。这不是一个 调用函数;如果此调用会导致调试目标代码运行,则此调用会抛出一个
Debugger.DebuggeeWouldRun
异常。
find(*name*)
返回对最内层环境的引用,从此环境开始,该环境绑定 name。如果 name 在此环境中不在范围内,则返回
null
。Name 必须是一个字符串,其值为有效的 ECMAScript 标识符名称。
源元数据¶
- 从文件生成
js/src/doc/Debugger/Debugger.Environment.md
- 水印
sha256:3d6f67939e351803d5d7fe201ed38c4aaf766caf032f255e168df1f1c6fe73cb
- 变更集