在JavaScript中,$(document).ready(function() {}) 的执行时机与主线程代码的关系如下:
核心结论:
不是等待所有JS主线程代码执行完才执行,而是 在DOM树构建完成(HTML解析完毕)后立即执行,与主线程代码的执行顺序取决于它们在文档中的位置。
详细机制:
-
触发条件
$(document).ready()在 DOM树构建完成(DOMContentLoaded事件触发) 时执行,无需等待图片、样式表等外部资源加载(与window.onload不同)。 -
与主线程代码的关系:
-
若
ready()定义在<head>中:
主线程的同步代码(如<script>标签内的代码)会 优先执行(因为HTML解析遇到<script>时会暂停解析并执行脚本)。此时: -
若
ready()定义在<body>末尾:
DOM树已基本构建完成,ready()回调可能 几乎立即执行:
-
-
事件队列机制:
ready()回调属于 异步任务,即使DOM已就绪,其回调仍需等待主线程的 当前执行栈清空 后才会执行:
执行流程图解:
HTML解析开始 │ ├─ 遇到<script>标签 → 暂停解析,执行同步JS代码 │ (主线程代码在此处运行) │ ├─ DOM树构建完成 → 触发`DOMContentLoaded`事件 │ → 将`ready()`回调推入异步队列 │ ├─ 主线程执行栈清空 → 从异步队列中取出`ready()`回调执行 │ └─ 继续加载图片等资源 → 触发`window.onload`
关键总结:
-
不依赖主线程代码完成,依赖 DOM树构建完成。
-
执行顺序 由代码位置和异步队列机制共同决定:
-
同位置的同步代码 优先于
ready()回调执行。 -
即使DOM已就绪,回调也需 等待主线程空闲。
-
-
与
window.onload的区别:ready()在DOM就绪后执行(更快),window.onload需等待所有资源加载完成(较慢)。
参考:https://chat.deepseek.com/a/chat/s/f170584c-b103-46ac-9ebe-e754688832e2最佳实践:将初始化逻辑放在
ready()中,确保操作DOM前结构已就绪,同时避免阻塞页面渲染。
浙公网安备 33010602011771号