Error.prototype.stack

非标准: 此功能是非标准的,没有标准化。请勿在面向 Web 的生产网站上使用它:它不适用于所有用户。实现之间也可能存在很大的不兼容性,并且行为将来可能会发生变化。

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

Error 实例的非标准stack 属性提供了一个跟踪,显示调用了哪些函数、按什么顺序调用、从哪一行和哪个文件调用以及使用哪些参数。堆栈字符串从最近的调用到最早的调用进行,最终返回到原始全局范围调用。

字符串。

由于 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
[email protected]:10:24
[email protected]:6:6
[email protected]:2:6
global [email protected]:13:4

#### SpiderMonkey
[email protected]:10:15
[email protected]:6:3
[email protected]: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

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

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

无需抛出错误,然后再捕获它。

在 V8 中,可以使用非标准的 Error.captureStackTrace()Error.stackTraceLimitError.prepareStackTrace() API 来定制堆栈跟踪。有关详细信息,请阅读 V8 文档中的堆栈跟踪 API

堆栈帧也可以是除显式函数调用以外的其他内容。例如,事件监听器、超时作业和 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 [email protected]:1:65
====
eval code@
eval@[native code]
global [email protected]:3:17

#### SpiderMonkey
[email protected] 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 文档和使用 //# sourceURL 指令为 eval 脚本命名 博客文章。

示例

使用堆栈属性

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

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

规范

不属于任何标准。

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅