确保首先运行Javascript脚本?

时间:2012-02-21 23:57:10

标签: javascript hoisting operator-precedence

我注意到某些脚本似乎在某个页面上的其他脚本之前被调用,我想知道,脚本加载的具体顺序是什么?在引用.js脚本之前的页内?它们是按照从提到的第一个<script>到页面的最后一个顺序运行的,还是依赖于浏览器?如何确保首先在页面中运行特定脚本?

4 个答案:

答案 0 :(得分:9)

只要没有动态加载脚本或将脚本标记为异步或延迟,脚本就会按照页面中遇到的顺序运行或评估。因此,遇到的第一个脚本首先运行。

必须加载的外部引用的脚本文件将导致所有进一步的javascript执行等待,直到加载并解析并运行该外部引用的文件。

因此,正常(非异步,非延迟)javascript的评估顺序是100%确定为页面中遇到的顺序。

答案 1 :(得分:5)

默认情况下,script标记会按照HTML文档中的标记顺序下载和评估。

但是,如果使用asyncdefer属性,则在脚本完成下载(异步)后或页面完成加载(延迟)后执行。

答案 2 :(得分:4)

  

我注意到某些脚本似乎先于其他脚本调用   页。我想知道,脚本加载的具体顺序是什么?

这是由W3C在其语言规范中设定的。例如,对于HTML 4.01 Specification,它在Section 18.2.4 Dynamic modification of documents, item 1中定义。

  

在引用.js脚本之前的页内?

见上文。不,内联和链接脚本的处理方式相同。

  

它们是按照从第一次提到到最后一页的顺序运行的,   或者这是依赖于浏览器的?

规范要求它们从上到下依次运行。您必须找到一个根据规范实现该语言的浏览器。我现在无法想到以不同方式处理SCRIPT标签,但我确信这是可能的。

要考虑的另一件事是“跑”的定义。这可能听起来像语义解析,但事实并非如此。与任何编程语言一样,JavaScript本身也是按照标准运行的。 ECMA-262 5.1 Edition / June 2011 standard中指定了JavaScript,以便在第7节词汇约定中从左到右进行评估。 (行结尾被视为下一行的最左侧字符。)本文档还提供了评估语句和其他操作的顺序的约定,例如WHILE或FOR语句。

  

如何确保首先在页面中运行特定脚本?

(1)将其置于顶部,(2)选择实现语言规范的浏览器。

但是,我觉得这个问题背后可能还有更多内容。如果您试图阻止执行意外代码,则必须阻止它,直到ONLOAD事件处理程序注册页面完成为止。 (只需将您的操作包含在函数中或用IF包围它们以检查布尔标志,即ONLOAD将isLoaded设置为true。)然后,当ONLOAD事件处理程序触发时,您可以按照自己的计划启动操作而不用不必担心像未实例化的DOM对象这样的事情。

答案 3 :(得分:1)

脚本按照在html文件中评估的顺序运行,就像从上到下阅读它一样。

但是,async和defer可以覆盖具有这些实现的浏览器。