我们都知道我们可以启动一些网络工作者,给他们一些平凡的任务,并在某个时刻获得响应,在这个阶段我们通常会解析数据并以某种方式将其呈现给用户。
嗯......任何人都可以提供一个相对深入的解释,说明为什么Web Workers无法访问DOM?考虑到经过深思熟虑的OO设计方法,我只是不明白为什么不应该这样做?
编辑:
我知道这是不可能的,也没有实际答案,但我觉得我需要更深入的解释。如果您觉得这与社区无关,请随时关闭此问题。
答案 0 :(得分:2)
浏览器中Javascript的整个世界最初设计有一个巨大的简化 - 单线程(在有webWorkers之前)。这个单一的假设使得编写浏览器变得更简单,因为永远不会有线程争用,并且永远不会是尝试同时修改相同对象或属性的两个活动线程。这使得在浏览器中编写Javascript并在浏览器中实现Javascript更简单。
然后,需要有能力做更长时间的运行"背景"输入不会阻止主线程的东西。好吧,将它放入现有浏览器中的唯一实用方法是在网上已有数亿页的Javascript,这是为了确保这个" new" Javascript的线程永远不会搞乱现有的主线程。
所以,它的实现方式是它可以与主线程或主线程可以修改的任何对象(例如整个DOM和几乎所有主机对象)进行通信的唯一方式是通过消息传递,通过它的实现自然地同步并且不受线程争用的影响。
以下是相关答案:Why doesn't JavaScript get its own thread in common browsers?
答案 1 :(得分:2)
其他答案是正确的; JS最初设计为单线程作为简化,此时添加多线程必须非常小心。我想详细说明Web Workers中的线程安全性。
当您使用postMessage
向工作人员发送消息时,会发生以下三种情况之一,
说到DOM节点,
答案 2 :(得分:0)
Web Workers没有DOM访问权限,因为DOM代码不是线程安全的。通过DOM代码,我的意思是浏览器中处理DOM调用的代码。
使线程不安全的代码安全是一个巨大的项目,并没有一个主要的浏览器正在这样做。
Servo项目正在从头开始编写新的浏览器,我认为他们正在编写带有线程安全性的DOM代码。