JS中setTimeout与document.write插入脚本的执行顺序疑问
问题解析:为什么
document.write插入的脚本先于setTimeout执行 先看你的代码:
setTimeout(() => console.log(123), 0) document.write('<script>console.log(333)</script>')
核心原因:document.write插入的脚本是同步执行的
你的误解在于认为所有脚本执行都属于宏任务,但document.write的行为有特殊性:
- 主线程执行到
setTimeout时,会将回调函数放入宏任务队列,等待当前执行栈清空后再处理。 - 执行
document.write时,浏览器会直接将内容写入当前活跃的文档流。对于插入的<script>标签,浏览器会立即解析并同步执行其中的代码——也就是console.log(333)会直接在当前执行栈中运行,不会进入宏任务队列。 - 只有当当前主线程的所有同步代码(包括
document.write插入的脚本)执行完毕后,事件循环才会取出宏任务队列中的setTimeout回调,执行console.log(123)。
规范依据
根据HTML标准定义:
当通过
document.write向文档写入内容时,写入的内容会被视为当前文档解析流程的一部分。对于其中的<script>元素,浏览器会暂停当前解析,立即执行该脚本的内容,执行完成后才会继续后续的文档解析或代码执行。
只有通过异步方式加载的脚本(比如动态创建<script>并设置src属性、使用async/defer属性)才会被放入宏任务队列,等待合适时机执行。
内容的提问来源于stack exchange,提问作者Ислам Рустамов
相关产品推荐
相关产品推荐

