一个浏览器窗口中的所有选项卡共享一个JavaScript线程

Do all tabs in a browser window share a single JavaScript thread?

本文关键字:一个 共享 JavaScript 选项 线程 浏览器 窗口      更新时间:2023-09-26

一般来说,JavaScript在浏览器中的执行被认为是单线程的。这个线程是否适用于浏览器窗口中打开的所有选项卡?

换句话说,如果(不同的)JavaScript代码在不同的选项卡中运行,它们都是使用单个线程执行的?

另外,当您打开同一浏览器的多个窗口并且每个窗口包含多个选项卡时,会发生什么?

最后,上面的答案取决于浏览器厂商/版本等吗?

没有办法以通用的方式回答这个问题,因为这是特定于浏览器实现的。

几乎所有旧的浏览器总是为每个标签使用一个线程,但是更现代的浏览器/版本可能已经改变了这一点(例如,chrome 每个标签有一个线程-实际上,它甚至每个标签有一个完整的进程)。编辑:对评论

的更正

实际上chrome使用进程/站点实例。这意味着一个在多个选项卡中打开的站点仍然会以相同的方式呈现流程

如果你是出于性能原因问它(有点像问"是否可以使用永恒的无限循环来阻止我的网站中的所有内容,或者会传播到其他选项卡"),假设线程是由每个人共享的更安全。如果它在当前浏览器中,那么你为它做了计划,如果它不在,那么你得到了比计划更好的性能,几乎没有问题。

为了让一些代码在自己的线程中运行,在Web Workers中有一个循环,但是它们还远远没有在每个"现代"浏览器中完全实现。

如果你看看Javascript postMessage(),例如window.postMessage('hi-there', location.origin),要创建一个消息,你必须添加原点。当您获得消息事件时,您应该使用消息中的起源检查您的起源,因为您可能从另一个选项卡获取消息。这将表明浏览器本身是主窗口。我不确定,但它可能是,当你改变到一个不同的选项卡,以前的Dom被保存和新选项卡的Dom被激活。