Error.prototype.stack
非标准:此特性未标准化。我们不建议在生产环境中使用非标准特性,因为它们浏览器支持有限,并且可能会更改或被移除。但是,在没有标准选项的特定情况下,它们可以是合适的替代方案。
注意: stack 属性已由所有主流 JavaScript 引擎实际实现,并且 JavaScript 标准委员会正在寻求将其标准化。由于实现不一致,您无法依赖堆栈字符串的精确内容,但通常可以假设它存在并将其用于调试目的。
非标准的 stack 属性是 Error 实例的属性,它提供了函数调用顺序、来自哪个行和文件以及带有哪个参数的跟踪。堆栈字符串从最近的调用追溯到最早的调用,一直回到最初的全局范围调用。
值
字符串。
由于 stack 属性是非标准的,不同的实现将其安装在不同的位置。
- 在 Firefox 中,它是
Error.prototype上的一个访问器属性。 - 在 Chrome 和 Safari 中,它是每个
Error实例上的一个数据属性,具有以下描述符:
Error.prototype.stack 的属性属性 | |
|---|---|
| 可写 | 是 |
| 可枚举 | 否 |
| 可配置 | 是 |
描述
每个 JavaScript 引擎都使用自己的堆栈跟踪格式,但它们在高级结构上相当一致。每个实现都使用堆栈中的单独一行来表示每个函数调用。直接导致错误的调用位于顶部,启动整个调用链的调用位于底部。以下是一些堆栈跟踪的示例:
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.stackTraceLimit 和 Error.prepareStackTrace()。其他引擎在不同程度上支持此 API。
不同的引擎在不同的时间设置此值。大多数现代引擎在创建 Error 对象时设置此值。这意味着您可以在函数内部获取完整的调用堆栈信息,如下所示:
function foo() {
console.log(new Error().stack);
}
而无需先抛出错误然后捕获它。
堆栈帧也可以是显式函数调用以外的其他内容。例如,事件监听器、超时作业和 Promise 处理程序都会开始自己的调用链。eval() 和 Function 构造函数调用中的源代码也会出现在堆栈中。
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 属性将堆栈跟踪输出到浏览器窗口。您可以使用它来检查浏览器的堆栈结构。
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;
}
规范
不属于任何标准。
浏览器兼容性
加载中…
另见
- TraceKit 在 GitHub 上
- stacktrace.js 在 GitHub 上
- V8 文档中的 堆栈跟踪 API