JavaScript脚本按HTML顺序严格执行:var声明提升但赋值不提升,let/const存在暂时性死区,function声明完整提升但内部逻辑仍依赖执行时机,defer脚本严格保序,动态插入脚本不继承前序变量,DOM就绪不等于脚本就绪。

脚本顺序直接决定全局变量能否被后续脚本读取到有效值,不是“可能出问题”,而是“必然按顺序执行赋值”——var声明会提升但赋值不提升,let/const连声明都不提升,function声明虽可跨块调用但内部依赖仍受执行时机约束。
为什么<script>顺序错一位,<code>a就变成<code>undefined</script> </h3> <p>因为每个<script>块都有独立的创建阶段和执行阶段:浏览器先扫一遍当前块里的<code>var和<code>function声明(提升),再逐行执行语句(赋值)。块与块之间不共享执行流,前一个块没执行完,后一个块哪怕写了<code>console.log(a)也拿不到值。</script></p> <ul> <li> <code><script>var a = 1;</script></code> → <code><script>console.log(a);</script></code>:输出 <code>1</code> </li> <li>顺序颠倒:第二个脚本执行时,<code>a</code>尚未声明,报 <code>ReferenceError: a is not defined</code> </li> <li>若第一个脚本用 <code>let a = 1</code>,哪怕位置在前,第二个脚本仍报错——<code>let</code>存在暂时性死区(TDZ),<code>a</code>在声明语句执行前不可访问</li> </ul> <h3> <code>function</code>声明能跨<script>调用,但别急着信</script>
function fn() {}会被完整提升到全局上下文的创建阶段,所以只要它所在的








