Web Workers

安全与限制
在worker的代码中,不要访问一些重要的JavaScript对象,如document、window、console、parent,更重要的是不要访问DOM对象。也许不用DOM元素以至不能更新页面元素听上去有点严格,但是这是一个重要的安全设计决定。
想象一下,如果众多线程都试着去更新同一个元素那就是个灾难。所以,web worker需要处在一个严格的并线程安全的环境中。
正如之前所说,你可以通过worker处理数据,并将结果返回主线程,进而更新DOM元素。尽管它们不能访问一些重要的JavaScript对象, 但是它们可以调用一些函数,如setTimeout()/clearTimeout()、setInterval()/clearInterval()、 navigator等等,也可以访问XMLHttpRequest和localStorge对象。

同源限制 //跨域/跨标签 通信必须要有引用

两种worker:专用线程(dedicated worker)和共享线程(shared worker, 在几个Browser上下文中共享一个SharedWorkerGlobalScope

实际应用场景:
worker的实际发生场景可能是,你需要处理一个同步的第三方接口,于是主线程需要等待结果再进行下一步操作。这种情况下,你可以生成一个worker,由它代理,异步完成此任务。
Web worker在轮询情况下也非常适用,你可以在后台不断查询目标,并在有新数据时向主线程发送消息。
你也许遇到需要向服务端返回大量的数据的情况。通常,处理大量数据会消极影响程序的响应能力,然后导致不良用户体验。更优雅的办法是将处理工作分配给若干worker,由它们处理不重叠的数据。
还有应用场景会出现在通过多个web worker分析音频或视频的来源,每个worker针对专项问题。
/////////////// 共享worker
myWorker.port.onmessage // 如果使用addEventListener监听(worker中也是如此)则需要手动 wk.port.start();
worker 内使用 onconnect 获取 e.ports[0] 与主线程进行通讯。