浏览器的事件循环何时开始?

When does the browser's event loop start?

本文关键字:开始 何时 循环 事件 浏览器      更新时间:2023-09-26

我使用的是一个在页面加载时自动连接到服务器的框架。我可以通过传递options参数来禁用它,但让我困惑的是:

您可以通过在事件循环的第一个周期结束之前禁用io.sails.autoConnect来阻止这个初始套接字自动连接。

我的问题是:

  1. 事件循环的第一个周期何时结束?
  2. 这种行为是否在所有现代(IE9+)浏览器中相同?
  3. 我在库和我的入口文件之间加载了一堆脚本(在
  4. 中)。这对第一个周期结束有影响吗?
  5. 我如何确保我的代码在第一个周期结束之前运行?
  6. 这种自动连接的实现被认为是良好的实践吗?

源文件的文档更明确一些;它说"这可以通过在事件循环的第一个周期内设置io.socket.options来禁用或配置。"

基本上发生的事情是在库中存在一个setTimeout(fn, 0)调用,这是启动并行进程的惯用方法。然而,在JS标准中明确指出JS是单线程的:换句话说,即使setTimeoutsetInterval异步的,它们实际上并不是并行的,因为它们的任何代码都将与任何其他代码同时执行。所以它们要等到当前函数结束后才执行。这种排队机制被称为JavaScript事件循环。

相信脚本作者要求您做的是修改源以包含相关的更改,为了您的方便,可能在文件的底部。

可能通过在加载给定JS的标签下面放置<script>标签来实现类似的效果。这在HTML 4中还没有明确标准化,但在新的HTML 5规范中可能会隐式标准化(这是规范中不同部分之间复杂的交互)。

就HTML5而言,看起来当前的规范说有一个afterscriptexecute事件和一个load事件在任何远程脚本加载后立即发生(或者,如果它是一个内联脚本,load事件被安排为一个任务——我不确定它们何时发生)。因此,您可以在不修改脚本的情况下保证它:

<script>
function do_not_autoload() { /* ... */ }
</script>
<script onload="do_not_autoload()" src="./path/to/sails.io.js"></script>

但是我不确定script@onload的兼容性表是什么样子的。

我给你做了一个jsfiddle,可以用来抓取不同浏览器的"指纹",以了解在野外有什么评估命令。*是document.body.onload事件。在我的系统上,它产生:

Firefox 32.0.3 : cafdbe*
Chrome 37.0.2062 : cafd*be
IE 11.0.9600 : cafd*be

也就是说