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