Error.prototype.stack
非标准: 此功能是非标准的,没有标准化。请勿在面向 Web 的生产网站上使用它:它不适用于所有用户。实现之间也可能存在很大的不兼容性,并且行为将来可能会发生变化。
注意:stack
属性实际上由所有主要的 JavaScript 引擎实现,并且JavaScript 标准委员会正在寻求将其标准化。您不能依赖于堆栈字符串的精确内容,因为实现不一致,但您可以大体上假设它存在并将其用于调试目的。
Error
实例的非标准stack
属性提供了一个跟踪,显示调用了哪些函数、按什么顺序调用、从哪一行和哪个文件调用以及使用哪些参数。堆栈字符串从最近的调用到最早的调用进行,最终返回到原始全局范围调用。
值
字符串。
由于 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 [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
对象时设置它。这意味着您可以使用以下方法在函数内获取完整的调用堆栈信息
function foo() {
console.log(new Error().stack);
}
无需抛出错误,然后再捕获它。
在 V8 中,可以使用非标准的 Error.captureStackTrace()
、Error.stackTraceLimit
和 Error.prepareStackTrace()
API 来定制堆栈跟踪。有关详细信息,请阅读 V8 文档中的堆栈跟踪 API。
堆栈帧也可以是除显式函数调用以外的其他内容。例如,事件监听器、超时作业和 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 [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
属性将堆栈跟踪输出到浏览器窗口。您可以使用它来检查浏览器的堆栈结构。
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 表格仅在浏览器中加载
另请参阅
- TraceKit on GitHub
- stacktrace.js on GitHub
- 堆栈跟踪 API in the V8 docs