Error对象的stack属性为何可选?哪些场景下stack会为undefined?
Error对象的stack属性何时会是undefined
- 未触发生成逻辑的Error实例:有些环境里,仅仅创建Error实例却不抛出、也不主动访问
stack属性,可能不会自动生成调用栈。比如早期Node.js版本,或者一些轻量嵌入式JS引擎,这种情况下new Error().stack会是undefined(不过现代主流浏览器大多会自动生成)。 - 自定义错误类未正确继承:如果自己写的错误类没有继承原生
Error,或者继承时没调用super()完成初始化,实例就不会有stack属性。比如:class MyError { constructor(msg) { this.message = msg; } } const err = new MyError('出错了'); console.log(err.stack); // undefined - 主动修改或删除stack属性:如果手动执行
err.stack = undefined或者delete err.stack,那stack自然就变成undefined了。 - 安全受限的执行环境:在沙箱环境、配置严格的Web Worker,或者CSP规则限制了调用栈暴露的场景中,JS引擎会禁止生成stack信息,此时访问stack就是undefined。
- 老旧或非标准JS环境:IE9及更早的浏览器完全不支持Error的stack属性,访问时直接返回undefined。还有一些小众的非标准JS运行时,也可能没实现这个属性。
- 用
Object.create创建的Error实例:通过Object.create(Error.prototype)生成的实例,跳过了Error构造函数的初始化流程,不会自动生成调用栈,stack属性就是undefined:const err = Object.create(Error.prototype); err.message = '测试'; console.log(err.stack); // undefined
内容的提问来源于stack exchange,提问作者PierBJX
相关产品推荐
相关产品推荐

