模块脚本异常通常不阻断其他独立模块执行,但同步加载时前序异常会终止当前script内后续语句;ES模块具隔离性,仅依赖链上初始化失败会阻断;动态导入失败仅拒绝Promise;全局错误处理器不当处理可能引发页面瘫痪。

模块脚本发生未捕获异常时,**通常不会直接中断或阻断同一页面中其他独立模块脚本的执行**,但存在几种关键场景会导致链式影响——这种影响不是“自动传染”,而是由加载方式、执行时机和运行环境共同决定的。
同步脚本中的异常会终止后续语句执行
如果多个模块通过 <script> 标签以同步方式(无 async 或 defer)依次引入,且它们共享同一全局执行上下文:
- 前一个脚本抛出未捕获异常,会导致该
<script>块内剩余代码停止执行; - 但浏览器会继续解析并执行下一个
<script>标签中的代码(前提是它本身没被前面异常波及); - 真正中断后续所有脚本的情况,仅发生在异常触发了
window.onerror并显式调用了event.preventDefault(),或某些老旧框架做了全局拦截,这非常规。
ES 模块(type="module")具有强隔离性
现代模块脚本默认是静态解析、独立作用域的:
- 一个模块内部抛出未捕获异常,只会影响该模块自身的初始化阶段(即
import和顶层语句); - 其他已成功加载的模块不受影响,它们导出的函数仍可被调用;
- 但如果模块 A
import了模块 B,而 B 初始化失败(如顶层throw),则 A 的import会失败,导致 A 也无法完成初始化——这是静态依赖链上的阻断,而非运行时传播。
动态导入(import())失败会拒绝 Promise,但不污染全局
使用 import('./module.js') 加载模块时:
- 若目标模块抛出异常,返回的 Promise 会被拒绝;
- 如果不加
.catch(),会触发unhandledrejection事件,但不会让其他模块“卡住”或失效; - 其他已加载或正在加载的模块照常运行,除非你主动在
unhandledrejection中调用location.reload()或throw新错误。
全局错误处理器可能放大影响范围
有些项目会统一注册 window.onerror 或 window.addEventListener('error'):
- 它们能捕获同步脚本异常,但无法捕获 Promise 拒绝(需用
unhandledrejection); - 如果这些处理器里写了
location.href = '/error'或document.body.innerHTML = '',就会间接导致整个页面功能瘫痪; - 这不是模块本身的链式影响,而是错误处理策略引发的副作用。
本质上,模块脚本之间的异常影响是有限且可控的。关键不在“会不会传”,而在于“怎么加载”和“谁在兜底”。只要避免同步阻塞式加载、慎用全局错误跳转、对动态导入做基本错误处理,就能有效切断异常的意外扩散。

















