我注意到某些脚本似乎在某个页面上的其他脚本之前被调用,我想知道,脚本加载的具体顺序是什么?引用 .js 脚本之前的页面内?它们是按页面中从第一个<script>
提到到最后一个的顺序运行的,还是依赖于浏览器?如何确保特定脚本首先在页面中运行?
4 回答
只要没有脚本被动态加载或标记为异步或延迟,脚本就会按照页面中遇到的顺序运行或评估。因此,遇到的第一个脚本首先运行。
必须加载的外部引用的脚本文件将导致所有进一步的 javascript 执行等待,直到该外部引用的文件被加载、解析并运行。
因此,正常(非异步,非延迟)javascript 的评估顺序是 100% 确定的,因为它在页面中遇到的顺序。
默认情况下,script
标签在 HTML 文档中遇到时会按顺序下载和评估。
但是,如果您使用async
ordefer
属性,则在脚本完成下载(异步)或页面完成加载(延迟)之后执行。
我注意到某些脚本似乎在某个页面上的其他脚本之前被调用。我想知道,脚本加载的具体顺序是什么?
这是由 W3C 在其语言规范中设置的。例如,对于HTML 4.01 规范,它在第 18.2.4 节动态修改文档,第 1 项中定义。
引用 .js 脚本之前的页面内?
往上看。不,内联脚本和链接脚本的处理方式相同。
它们是按页面中从第一个提到到最后一个的顺序运行的,还是依赖于浏览器?
规范要求它们从上到下按顺序运行。您必须找到一个根据规范实现该语言的浏览器。我现在想不出任何以不同方式处理 SCRIPT 标签的方法,但我确信这是可能的。
要考虑的另一件事是“运行”的定义。这听起来像是语义解析,但事实并非如此。与任何编程语言一样,JavaScript 本身就是按照标准设计的。JavaScript 在ECMA-262 5.1 版/2011 年 6 月标准中指定,以便在第 7 节词汇约定中从左到右进行评估。(行尾被视为下一行的最左侧字符。)本文档还提供了语句和其他操作的评估顺序的约定,例如 WHILE 或 FOR 语句。
如何确保特定脚本首先在页面中运行?
(1) 放在最上面,(2) 选择实现语言规范的浏览器。
但是,我觉得这个问题背后可能还有更多的东西。如果您试图阻止意外代码执行,则必须阻止它,直到 ONLOAD 事件处理程序注册该页面已完成。(只需将您的操作包含在一个函数中或用 IF 将它们包围以检查布尔标志,即 ONLOAD 将 isLoaded 设置为 true。)然后,当 ONLOAD 事件处理程序触发时,您可以按自己的计划启动操作,而无需不必担心诸如未实例化的 DOM 对象之类的事情。
脚本按照它们在 html 文件中的评估顺序运行,就像您从上到下阅读它一样。
但是,对于已实现这些功能的浏览器, async 和 defer 可以覆盖这一点。