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;
}

規範

不屬於任何標準。

瀏覽器相容性

另見