什么时候生成错误对象的堆栈?

时间:2017-08-07 07:32:44

标签: javascript v8

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

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

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

这是JS引擎的特性还是标准行为?

1 个答案:

答案 0 :(得分:3)

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

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

  

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

Node.js的document也说了同样的话:

  

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

创建Error对象时,已经收集

但是,在第一次访问stack属性之前,它不是格式化,因为同一维基页上的段落声明:

  

为了提高效率,堆栈跟踪在捕获时不会格式化   但是根据需要,第一次访问stack属性。