async="false"无效,浏览器会忽略;async是布尔属性,仅支持存在(异步)或不存在(默认同步顺序执行);动态插入脚本需靠插入时机或onload链式控制,或用Promise/ES模块确保顺序。

这个说法不成立。async="false" 并不是有效的 HTML 属性值,浏览器会忽略它,无法实现“强制保持执行顺序”的效果。
async 属性只有两个有效值
async 是一个布尔属性,只接受两种状态:
- 存在且无值(如
<script async>),等价于async="async",表示异步加载并执行,不保证顺序; - 完全不写该属性,即默认行为:按文档顺序阻塞解析、依次下载并执行(即“同步”行为)。
写 async="false" 不会恢复同步行为,它只是把 async 当作一个普通字符串属性,浏览器不识别,脚本仍按默认规则处理——但若同时设置了 defer 或动态插入方式不同,实际行为可能更复杂。
动态插入 script 时想保证执行顺序,靠的是插入方式和时机
关键不在 async,而在如何创建和添加节点:
- 用
document.createElement('script')创建后,调用appendChild()或insertBefore()插入到 DOM 中 —— 若插入到<head>或<body>开头,且未设async或defer,则按插入顺序依次加载执行; - 如果多个 script 是连续插入的(无 await / 回调控制),且都未设
async,浏览器通常会按插入顺序发起请求,并按下载完成顺序执行 —— 但这不绝对可靠,尤其跨域或缓存差异大时; - 真正可靠的顺序控制,需手动链式加载:等前一个 script 的
onload触发后再创建并插入下一个。
更稳妥的替代方案
避免依赖 HTML 属性来“纠正”异步行为,推荐明确手段:
- 不设
async和defer,直接插入并依赖 DOM 顺序(适合同域、确定资源可用); - 用
Promise封装每个 script 加载过程,再用await串行执行; - 使用现代模块系统(如 ES modules 的
import()动态导入),天然支持依赖顺序和错误处理。
小结
不要写 async="false" —— 它无效,还可能造成误解。需要顺序执行,就去掉 async,或用代码逻辑显式控制加载流程。浏览器对 script 的执行顺序有明确定义,关键是理解默认行为,而不是试图用非法属性去覆盖它。


















