2017-08-07 37 views
3

每次我實例化一個Error對象時,都有一個.stack字段。假設建立一個堆棧跟蹤是一個代價高昂的操作,我的自然反應是將它們用於特殊情況。錯誤對象的堆棧何時生成?

但是我記得讀到在v8中stacktrace只是在讀取.stack字段時計算出來的。

如果我從不閱讀堆棧,我能否假設new Error(...)new Object(...)一樣昂貴?

這是JS引擎的特性還是標準行爲?

+0

難道你不能只記錄錯誤? –

+0

收集堆棧跟蹤仍然是一個代價高昂的操作,即使它沒有格式化並存儲爲字符串。 – Bergi

回答

3

Error.prototype.stack是一個非標準功能,所以其行爲取決於實現。

在基於V8平臺的情況下,在GitHub上的wiki說:創建錯誤時

堆棧跟蹤收集和相同 無論在哪裏,或者有多少次錯誤被拋出。

而且Node.js的的document也說了同樣的事情:

Error對象捕捉「堆棧跟蹤」詳細介紹在該錯誤被實例化的代碼 點,並且可以提供一個文本 錯誤的描述。

所以它已經是收集創建Error對象時。

但是,它不是格式化首次stack屬性進行訪問,直到爲同一wiki頁面狀態段落:

爲了提高效率堆棧跟蹤,當他們被捕獲 不格式化但根據需要,第一次訪問堆棧屬性。