Web Workers 是浏览器提供的独立执行环境,非 JavaScript 多线程,不共享内存、不可操作 DOM,仅通过 postMessage 进行消息通信。
Web Workers 不是 JavaScript 的多线程,而是浏览器提供的独立执行环境;它不能直接操作 DOM,也不能共享内存,本质是“进程隔离 + 消息通信”。
document 或 window
Worker 脚本运行在独立的全局上下文中(WorkerGlobalScope),与主线程完全隔离。这意味着:
document、window、localStorage、fetch(部分浏览器支持,但需注意 CORS 和凭据)等 API 均不可用postMessage() 传递可序列化的数据(或 Transferable 对象,如 ArrayBuffer)document 会直接抛出 ReferenceError: document is not defined

new Worker() 实例化:// main.js
const worker = new Worker('./worker.js');
worker.postMessage({ type: 'start', data: [1, 2, 3] });
立即学习“Java免费学习笔记(深入)”;
worker.onmessage = (e) => {
console.log('主线程收到:', e.data);
};
worker.onerror = (e) => {
console.error('Worker 执行出错:', e.message);
};
对应 worker.js 中必须监听 onmessage 并调用 postMessage() 回传:
// worker.js
self.onmessage = function(e) {
const result = e.data.data.map(x => x * 2);
self.postMessage({ type: 'done', result });
};
this 或 window,必须用 self 引用当前 Worker 全局对象worker.terminate(),Worker 内部调用 self.close()
file:// 协议(需 HTTP(S) 服务)三者都是 Worker,但生命周期、作用域和用途完全不同:
DedicatedWorker:一对一绑定,仅创建它的脚本可通信,关闭页面即销毁SharedWorker:多个页面/iframe 可连接同一实例,用 port.start() 和 port.postMessage() 通信,需手动管理端口
ServiceWorker:注册后可拦截网络请求、实现离线缓存,运行在独立线程但受严格生命周期控制(如 install、activate、fetch 事件),且只支持 HTTPS(localhost 除外)别误把 SharedWorker 当作“共享内存方案”——它依然靠消息传递,只是多路复用一个 Worker 实例。
默认情况下,postMessage() 会深拷贝数据(结构化克隆算法),大对象(如百 MB 级 ArrayBuffer)会卡顿主线程:
postMessage(data, [data.buffer]) 进行零拷贝转移(data.buffer 将从原上下文移除)Date、RegExp、undefined、循环引用对象无法被克隆,会静默丢弃字段或报错MessageChannel 分离通道真正需要“并发计算”的场景(比如音频 FFT、大型数组排序),Worker 是可靠选择;但想绕过单线程做 UI 动画或状态同步?它解决不了——那得靠 requestIdleCallback 或更细粒度的任务调度。