设置window.location.href后旧页面的JavaScript代码是否会停止运行?
问题原因
修改window.location.href或者调用window.location.assign()触发页面跳转时,不会立即终止当前正在运行的JavaScript脚本,这是符合HTML规范的预期行为:
- 导航类操作属于浏览器的异步宏任务,会被加入事件循环队列等待执行
- 只有当前同步JavaScript执行栈完全清空、所有待处理微任务执行完毕后,浏览器才会开始处理页面跳转的流程
因此你示例中的代码在触发跳转设置后,仍会继续向下执行id.split("-")的逻辑,自然会因为id为假值抛出异常。
解决方案
要避免后续错误代码执行,只需要在触发跳转后终止当前执行上下文的运行即可,常见实现方案有两种:
- 单层函数调用场景下,在跳转逻辑后直接
return终止当前函数运行
function handleError() { window.location.href = "https://example.com" } function doWork(id) { if (!id) { handleError(); // 终止后续逻辑执行 return; } var oops = id.split("-"); // 后续逻辑不会在id为空时执行 }
- 多层函数嵌套调用场景下,可以通过抛出自定义错误的方式终止整个执行链
function handleError() { window.location.href = "https://example.com" // 抛出错误终止整个执行链 throw new Error('触发页面跳转,终止后续代码执行') } function doWork(id) { if (!id) { handleError(); } // 后续逻辑不会执行 var oops = id.split("-"); }
补充说明
该行为在所有现代浏览器中都是统一实现的,不存在兼容性差异。所有浏览器级别的导航、页面重绘操作优先级都低于当前正在执行的同步JS和微任务,永远不会打断当前同步代码的运行。
内容的提问来源于stack exchange,提问作者pdoherty926
相关产品推荐
相关产品推荐

