Error.prototype.stack

非标准:此特性未标准化。我们不建议在生产环境中使用非标准特性,因为它们浏览器支持有限,并且可能会更改或被移除。但是,在没有标准选项的特定情况下,它们可以是合适的替代方案。

注意: stack 属性已由所有主流 JavaScript 引擎实际实现,并且 JavaScript 标准委员会正在寻求将其标准化。由于实现不一致,您无法依赖堆栈字符串的精确内容,但通常可以假设它存在并将其用于调试目的。

非标准的 stack 属性是 Error 实例的属性,它提供了函数调用顺序、来自哪个行和文件以及带有哪个参数的跟踪。堆栈字符串从最近的调用追溯到最早的调用,一直回到最初的全局范围调用。

字符串。

由于 stack 属性是非标准的,不同的实现将其安装在不同的位置。

  • 在 Firefox 中,它是 Error.prototype 上的一个访问器属性。
  • 在 Chrome 和 Safari 中,它是每个 Error 实例上的一个数据属性,具有以下描述符:
Error.prototype.stack 的属性属性
可写
可枚举
可配置

描述

每个 JavaScript 引擎都使用自己的堆栈跟踪格式,但它们在高级结构上相当一致。每个实现都使用堆栈中的单独一行来表示每个函数调用。直接导致错误的调用位于顶部,启动整个调用链的调用位于底部。以下是一些堆栈跟踪的示例:

js
function foo() {
  bar();
}

function bar() {
  baz();
}

function baz() {
  console.log(new Error().stack);
}

foo();
#### JavaScriptCore
baz@filename.js:10:24
bar@filename.js:6:6
foo@filename.js:2:6
global code@filename.js:13:4

#### SpiderMonkey
baz@filename.js:10:15
bar@filename.js:6:3
foo@filename.js:2:3
@filename.js:13:1

#### V8
Error
    at baz (filename.js:10:15)
    at bar (filename.js:6:3)
    at foo (filename.js:2:3)
    at filename.js:13:1

V8 提供了非标准的 堆栈跟踪 API,用于自定义堆栈跟踪,包括 Error.captureStackTrace()Error.stackTraceLimitError.prepareStackTrace()。其他引擎在不同程度上支持此 API。

不同的引擎在不同的时间设置此值。大多数现代引擎在创建 Error 对象时设置此值。这意味着您可以在函数内部获取完整的调用堆栈信息,如下所示:

js
function foo() {
  console.log(new Error().stack);
}

而无需先抛出错误然后捕获它。

堆栈帧也可以是显式函数调用以外的其他内容。例如,事件监听器、超时作业和 Promise 处理程序都会开始自己的调用链。eval()Function 构造函数调用中的源代码也会出现在堆栈中。

js
console.log(new Function("return new Error('Function failed')")().stack);
console.log("====");
console.log(eval("new Error('eval failed')").stack);
#### JavaScriptCore
anonymous@
global code@filename.js:1:65
====
eval code@
eval@[native code]
global code@filename.js:3:17

#### SpiderMonkey
anonymous@filename.js line 1 > Function:1:8
@filename.js:1:65

====
@filename.js line 3 > eval:1:1
@filename.js:3:13

#### V8
Error: Function failed
    at eval (eval at <anonymous> (filename.js:1:13), <anonymous>:1:8)
    at filename.js:1:65
====
Error: eval failed
    at eval (eval at <anonymous> (filename.js:3:13), <anonymous>:1:1)
    at filename.js:3:13

在 Firefox 中,您可以使用 //# sourceURL 指令来命名 eval 源。请参阅 Firefox 的 调试 eval 源文档。

示例

使用 stack 属性

以下脚本演示了如何使用 stack 属性将堆栈跟踪输出到浏览器窗口。您可以使用它来检查浏览器的堆栈结构。

js
function trace() {
  throw new Error("trace() failed");
}
function b() {
  trace();
}
function a() {
  b(3, 4, "\n\n", undefined, {});
}
try {
  a("first call, first arg");
} catch (e) {
  document.getElementById("output").textContent = e.stack;
}

规范

不属于任何标准。

浏览器兼容性

另见