You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS中setTimeout与document.write插入脚本的执行顺序疑问

问题解析:为什么document.write插入的脚本先于setTimeout执行

先看你的代码:

setTimeout(() => console.log(123), 0)
document.write('<script>console.log(333)</script>')

核心原因:document.write插入的脚本是同步执行的

你的误解在于认为所有脚本执行都属于宏任务,但document.write的行为有特殊性:

  1. 主线程执行到setTimeout时,会将回调函数放入宏任务队列,等待当前执行栈清空后再处理。
  2. 执行document.write时,浏览器会直接将内容写入当前活跃的文档流。对于插入的<script>标签,浏览器会立即解析并同步执行其中的代码——也就是console.log(333)会直接在当前执行栈中运行,不会进入宏任务队列。
  3. 只有当当前主线程的所有同步代码(包括document.write插入的脚本)执行完毕后,事件循环才会取出宏任务队列中的setTimeout回调,执行console.log(123)。

规范依据

根据HTML标准定义:

当通过document.write向文档写入内容时,写入的内容会被视为当前文档解析流程的一部分。对于其中的<script>元素,浏览器会暂停当前解析,立即执行该脚本的内容,执行完成后才会继续后续的文档解析或代码执行。

只有通过异步方式加载的脚本(比如动态创建<script>并设置src属性、使用async/defer属性)才会被放入宏任务队列,等待合适时机执行。

内容的提问来源于stack exchange,提问作者Ислам Рустамов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:45:41