1

我知道 JS 函数(即setTimeout(function(){...}, TIME))将它接收到的函数作为参数放入浏览器的事件循环中,并且在处理完所有内联/同步 JS 调用后,将处理此事件循环。

但是,当他具有以下 HTML 页面结构时,实际会发生什么:

<html>
 <head>
  <script> MANY INLINED SCRIPTS </script>
  <script src="file.js"></script>
  <script> setTimeout(function(){...}, TIME)</script>
   .
   .
   .

然后页面继续,可能这种结构会不断重复,直到</html>到达。

在这种情况下,事件队列何时会被处理?

编辑:我想为我页面中的脚本创建某种惰性加载器。我依赖来自其他来源的内容,这些内容应该只在 DOM 被解析后才会出现,并且希望是响应式的。

4

1 回答 1

4

一旦</script>找到结束标记,就会处理每个内联脚本。同样,<script>从服务器导入脚本作为单独文件的标签在收到文件时进行处理,并且该过程是同步的 - 浏览器在处理之前等待脚本内容(除了参见<script>标签编辑和标签相对较新的“异步”属性) IE 上的旧“延迟”属性,它可能会或可能不会按预期工作(感谢@RobG)。

setTimeout()因此,当浏览器看到完整的块时,带有调用的内联代码将运行<script>,然后在给定的毫秒数(大约)过去后调用传递的函数。您不能过分依赖超时处理的准确性。

除了超时机制之外,还有其他事件:用户交互、ajax 等。从概念上讲,它们都通过同一个网关汇集;也就是说,如果您的超时计划运行,但用户提前几毫秒单击了一个按钮,您的计时器代码将等待按钮处理完成。

于 2012-10-04T14:25:40.217 回答