何时生成错误对象堆栈?



每次我实例化一个错误对象时,都有一个.stack字段。假设构建堆栈跟踪是一项成本高昂的操作,我的自然反应是保留它们用于特殊情况。

但是我记得读到在 v8 中,堆栈跟踪仅在读取.stack字段时计算。

如果我从未阅读堆栈,我可以假设new Error(...)new Object(...)一样昂贵吗?

这是JS引擎的功能还是标准行为?

>Error.prototype.stack是一个非标准功能,因此其行为取决于实现。

对于基于 V8 的平台,GitHub 上的 wiki 说:

堆栈跟踪是在创建错误时收集的,并且是相同的 无论错误在何处或引发多少次。

而 Node.js 的文档也说了同样的话:

错误对象捕获详细说明代码中点的"堆栈跟踪" 实例化错误的位置,并可能提供文本 错误说明。

因此,在创建Error对象时已经收集了它。

但是,直到第一次访问stack属性时,它才会被格式化,因为同一 wiki 页面上的段落指出:

为了提高效率,堆栈跟踪在捕获时不会格式化 但按需,首次访问堆栈属性时。

最新更新