一个浏览器窗口中的所有选项卡共享一个JavaScript线程
Do all tabs in a browser window share a single JavaScript thread?
一般来说,JavaScript在浏览器中的执行被认为是单线程的。这个线程是否适用于浏览器窗口中打开的所有选项卡?
换句话说,如果(不同的)JavaScript代码在不同的选项卡中运行,它们都是使用单个线程执行的?
另外,当您打开同一浏览器的多个窗口并且每个窗口包含多个选项卡时,会发生什么?
最后,上面的答案取决于浏览器厂商/版本等吗?
没有办法以通用的方式回答这个问题,因为这是特定于浏览器实现的。
几乎所有旧的浏览器总是为每个标签使用一个线程,但是更现代的浏览器/版本可能已经改变了这一点(例如,chrome 每个标签有一个线程-实际上,它甚至每个标签有一个完整的进程)。编辑:对评论
实际上chrome使用进程/站点实例。这意味着一个在多个选项卡中打开的站点仍然会以相同的方式呈现流程
如果你是出于性能原因问它(有点像问"是否可以使用永恒的无限循环来阻止我的网站中的所有内容,或者会传播到其他选项卡"),假设线程是由每个人共享的更安全。如果它在当前浏览器中,那么你为它做了计划,如果它不在,那么你得到了比计划更好的性能,几乎没有问题。
为了让一些代码在自己的线程中运行,在Web Workers中有一个循环,但是它们还远远没有在每个"现代"浏览器中完全实现。
如果你看看Javascript postMessage()
,例如window.postMessage('hi-there', location.origin)
,要创建一个消息,你必须添加原点。当您获得消息事件时,您应该使用消息中的起源检查您的起源,因为您可能从另一个选项卡获取消息。这将表明浏览器本身是主窗口。我不确定,但它可能是,当你改变到一个不同的选项卡,以前的Dom被保存和新选项卡的Dom被激活。
- Facebook共享显示一个接一个的空白页面
- 我可以共享一个HTML播放器吗
- Angular 2,在没有直接关系的两个组件之间共享一个对象
- 节点模块对象范围:在所有函数之间共享一个对象
- jQuery复选框和span共享一个单击事件
- 共享这将在一个新窗口中打开facebook共享
- AngularJS:在控制器之间共享一个函数
- 如何将一个配置对象共享给多个数据
- 将共享的“code_block”从 loc-A 移动到 loc-B,只有一个书面的“code_block”实例
- 使用AngularJS服务将数据从一个html传输到另一个html(控制器之间的数据共享)
- 如何创建共享单个列表的链接下拉列表,并确保只能在一个下拉列表中选择每个值
- select2 - 如果多个选项共享一个值,则返回不正确的选定选项
- JS - 将文本区域的内容注入共享一个类的多个文本区域
- 如何将一个VS2013项目中的通用打字稿代码共享到单独的VS2013项目中
- 许多人在一个页面上共享社交网络的按钮
- onmouseleave在鼠标进入另一个元素的空间时触发,即使该空间与第一个元素共享
- 如何从一个共享属性的jQuery集合中获取一个属性数组
- 为什么我有一个共享缓存时,我jQuery.使用相同的缓存对象扩展两个对象
- AngularJS:如何在两个隔离的控制器和一个共享服务之间创建一个双向数据绑定
- Ember js -如何创建一个共享实用程序