关于unhandledrejection事件发送至脚本全局作用域的技术疑问
关于unhandledrejection事件的两个问题解答
1. “事件被发送至脚本的全局作用域”具体指什么?
当没有拒绝处理程序的JavaScript Promise被拒绝时,unhandledrejection事件会被发送至脚本的全局作用域;通常是window对象,也可能是Worker。
这里的“全局作用域”就是当前代码运行环境的顶层上下文:
- 在浏览器页面中,这个顶层上下文就是
window对象,你直接调用addEventListener绑定事件时,默认就是给window添加监听器; - 在Web Worker环境中,顶层上下文则是
self对象。
简单来说,这个未处理的Promise拒绝事件会被抛到当前执行环境的最顶层,让你能在全局层面捕获并处理它,而不是被局限在某个函数或局部作用域里。
2. 出现未处理的Promise拒绝后,脚本无法继续执行吗?
不会。未处理的Promise拒绝只会触发unhandledrejection事件,但不会中断后续代码的执行流程。
拿你的测试代码举例,哪怕加上后续执行的代码:
addEventListener('unhandledrejection', (event) => { console.log('unhandledrejection'); console.log(event.promise); console.log(event.reason); }); Promise.reject('sss'); console.log('脚本仍在执行');
运行后控制台会先输出unhandledrejection相关日志,紧接着输出脚本仍在执行,这就证明脚本没有因为未处理的Promise拒绝而停止。
不过要注意:部分旧浏览器或特定环境下会在控制台抛出警告,但这不会影响代码继续运行;Node.js的新版本中未处理的Promise拒绝可能导致进程退出,但浏览器环境下基本不会出现这种情况。
内容的提问来源于stack exchange,提问作者jwa
相关产品推荐
相关产品推荐

