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”,表示环境是声明性环境记录。函数调用、对 evallet 块、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,则返回 undefinedName 必须是一个字符串,它是有效的 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 在此环境中不在范围内,则返回 nullName 必须是一个字符串,其值为有效的 ECMAScript 标识符名称。

源元数据

从文件生成

js/src/doc/Debugger/Debugger.Environment.md

水印

sha256:3d6f67939e351803d5d7fe201ed38c4aaf766caf032f255e168df1f1c6fe73cb

变更集

7ae377917236