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