Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么WebWorkers不能访问DOM?_Javascript_Jquery_Dom_Browser_Web Worker - Fatal编程技术网

Javascript 为什么WebWorkers不能访问DOM?

Javascript 为什么WebWorkers不能访问DOM?,javascript,jquery,dom,browser,web-worker,Javascript,Jquery,Dom,Browser,Web Worker,我们都知道,我们可以启动一些web工作人员,给他们一些平凡的任务,并在某个时候得到响应,在这个阶段,我们通常解析数据并以某种方式将其呈现给用户 嗯。。。有谁能提供一个相对深入的解释,解释为什么Web工作者不能访问DOM?考虑到经过深思熟虑的OO设计方法,我不明白为什么他们不应该这样做 编辑: 我知道这是不可能的,它不会有一个实际的答案,但我觉得我需要一个更深入的解释。如果你觉得这个问题与社区无关,请随意关闭它。浏览器中的整个Javascript世界最初都是经过巨大简化设计的,在webWorker

我们都知道,我们可以启动一些web工作人员,给他们一些平凡的任务,并在某个时候得到响应,在这个阶段,我们通常解析数据并以某种方式将其呈现给用户

嗯。。。有谁能提供一个相对深入的解释,解释为什么Web工作者不能访问DOM?考虑到经过深思熟虑的OO设计方法,我不明白为什么他们不应该这样做

编辑:


我知道这是不可能的,它不会有一个实际的答案,但我觉得我需要一个更深入的解释。如果你觉得这个问题与社区无关,请随意关闭它。

浏览器中的整个Javascript世界最初都是经过巨大简化设计的,在webWorkers出现之前,它是单线程的。这个单一的假设使得编写浏览器变得非常简单,因为不可能有线程争用,也不可能有两个活动线程试图同时修改相同的对象或属性。这使得在浏览器中编写Javascript和在浏览器中实现Javascript变得更加简单

然后,需要一种能力来做一些运行时间更长的后台类型的事情,而不会阻塞主线程。好的,将其放入现有浏览器中的唯一实用方法是确保这个新的Javascript线程永远不会弄乱现有的主线程,因为浏览器上已经有数亿页的Javascript

因此,它的实现方式是,它可以与主线程或主线程可以修改的任何对象(如整个DOM和几乎所有主机对象)进行通信的唯一方式是通过消息传递,通过它的实现,消息传递自然是同步的,并且不会发生线程争用


这里有一个相关的答案:

浏览器中的整个Javascript世界最初都是以极大的简化设计的——在webWorkers出现之前是单线的。这个单一的假设使得编写浏览器变得非常简单,因为不可能有线程争用,也不可能有两个活动线程试图同时修改相同的对象或属性。这使得在浏览器中编写Javascript和在浏览器中实现Javascript变得更加简单

然后,需要一种能力来做一些运行时间更长的后台类型的事情,而不会阻塞主线程。好的,将其放入现有浏览器中的唯一实用方法是确保这个新的Javascript线程永远不会弄乱现有的主线程,因为浏览器上已经有数亿页的Javascript

因此,它的实现方式是,它可以与主线程或主线程可以修改的任何对象(如整个DOM和几乎所有主机对象)进行通信的唯一方式是通过消息传递,通过它的实现,消息传递自然是同步的,并且不会发生线程争用


这里有一个相关的答案:

Web工作人员没有DOM访问权限,因为DOM代码不是线程安全的。所谓DOM代码,我指的是浏览器中处理DOM调用的代码

使线程不安全的代码安全是一个巨大的工程,没有一个主要的浏览器在这样做


Servo project正在从头开始编写新的浏览器,我认为他们在编写DOM代码时考虑到了线程安全。

Web工作者没有DOM访问权限,因为DOM代码不是线程安全的。所谓DOM代码,我指的是浏览器中处理DOM调用的代码

使线程不安全的代码安全是一个巨大的工程,没有一个主要的浏览器在这样做


Servo project正在从头开始编写新的浏览器,我认为他们在编写DOM代码时考虑到了线程安全。

其他答案是正确的;JS最初被设计为单线程,作为一种简化,在这一点上添加多线程必须非常小心。我想详细介绍一下Web Workers中的线程安全

当您使用postMessage向工作人员发送消息时,会发生以下三种情况之一:

浏览器将消息序列化为JSON字符串,并在工作线程的另一端反序列化。这将创建对象的副本。 浏览器构造消息的结构化克隆,并将其传递给工作线程。这允许消息传递使用比1更复杂的数据类型,但本质上是一样的。 浏览器将传递消息或其部分的所有权。这仅适用于某些数据类型。它是零拷贝,但一旦主上下文将消息传输到工作上下文,它在主上下文中就变得不可用。这也是为了避免共享内存。 当涉及到DOM节点时

显然不是选项,因为DOM节点包含循环引用, 可以工作,但处于只读模式,因为工作进程对节点克隆所做的任何更改都不会反映出来 在UI中,以及 不幸的是,这不是一个选项,因为DOM是一棵树,转移节点的所有权意味着转移整个树的所有权。如果UI线程需要咨询DOM来绘制屏幕,并且它没有所有权,那么这会造成问题。
其他答案是正确的;JS最初被设计为单线程,作为一种简化,在这一点上添加多线程必须非常小心。我想详细介绍一下Web Workers中的线程安全

当您使用postMessage向工作人员发送消息时,会发生以下三种情况之一:

浏览器将消息序列化为JSON字符串,并在工作线程的另一端反序列化。这将创建对象的副本。 浏览器构造消息的结构化克隆,并将其传递给工作线程。这允许消息传递使用比1更复杂的数据类型,但本质上是一样的。 浏览器将传递消息或其部分的所有权。这仅适用于某些数据类型。它是零拷贝,但一旦主上下文将消息传输到工作上下文,它在主上下文中就变得不可用。这也是为了避免共享内存。 当涉及到DOM节点时

显然不是选项,因为DOM节点包含循环引用, 可以工作,但处于只读模式,因为工作进程对节点克隆所做的任何更改都不会反映在UI中,并且 不幸的是,这不是一个选项,因为DOM是一棵树,转移节点的所有权意味着转移整个树的所有权。如果UI线程需要咨询DOM来绘制屏幕,并且它没有所有权,那么这会造成问题。
大多数汽车只有一个方向盘是有原因的,想想看。。。如果有很多东西在进行更改,那么将所有这些级联更改进行排序将需要大量工作,这将导致布局缓慢。了解一般并发问题的背景信息。这是一种设计选择。并发性很难实现,JavaScript不希望您必须处理锁和信号量,同时还要处理DOM。@dave提到的问题详细说明了为什么,并对所有考虑的问题进行了足够深入的讨论。我认为这个选择只会有助于正确设计MVC应用程序。大多数汽车只有一个方向盘是有原因的,想想看。。。如果有很多东西在进行更改,那么将所有这些级联更改进行排序将需要大量工作,这将导致布局缓慢。了解一般并发问题的背景信息。这是一种设计选择。并发性很难实现,JavaScript不希望您必须处理锁和信号量,同时还要处理DOM。@dave提到的问题详细说明了为什么要这样做,并对所有考虑的问题进行了足够深入的讨论。我认为这种选择只会有助于正确设计MVC应用程序。这不仅仅是使DOM线程安全的问题。所有访问DOM的Javascript程序都必须改变它们的行为,才能以线程安全的方式使用DOM,否则到处都会有竞争条件。如果多个线程可以修改该对象,那么即使像domObj.prop===foo{domObj.prop=fee;}这样简单的东西也是一个争用条件。这是不正确的。WebWorkers是一个全新的特性,不使用WebWorkers的旧代码不需要更改。WebWorkers中无法进行DOM调用的原因是浏览器的DOM实现无法处理多个线程。这不仅仅是使DOM线程安全的问题。所有访问DOM的Javascript程序都必须改变它们的行为,才能以线程安全的方式使用DOM,否则到处都会有竞争条件。如果多个线程可以修改该对象,那么即使像domObj.prop===foo{domObj.prop=fee;}这样简单的东西也是一个争用条件。这是不正确的。WebWorkers是一个全新的特性,不使用WebWorkers的旧代码不需要更改。WebWorkers中无法进行DOM调用的原因是浏览器的DOM实现无法处理多个线程。