web worker 是浏览器提供的多线程机制,允许 javascript 在后台线程运行脚本以避免阻塞主线程;它不能操作 dom,需通过外部同源 js 文件加载,使用 postmessage/onmessage 通信,支持结构化数据传输,但不可传函数或 dom 节点。

什么是 Web Worker
Web Worker 是浏览器提供的多线程机制,允许 JavaScript 在后台线程中运行脚本,避免阻塞主线程(尤其是 UI 渲染和用户交互)。它不能直接操作 DOM,但能执行耗时计算、数据处理、轮询等任务。
如何创建并使用 Worker
Worker 必须从外部 JS 文件加载(不能是内联脚本),且需同源。基本用法如下:
-
新建 worker 文件(如
worker.js):self.onmessage = function(e) { const result = e.data * 2; self.postMessage(result); }; -
主线程中启动:
const worker = new Worker('worker.js'); worker.postMessage(42); // 发送数据 worker.onmessage = function(e) { console.log('收到结果:', e.data); // 84 }; - 可传任意结构化数据(支持 Structured Clone Algorithm),包括数组、对象、Date、RegExp 等,但不能传函数、DOM 节点或带有循环引用的对象。
常见通信与控制方式
Worker 和主线程通过 postMessage 和 onmessage 双向通信,还可配合以下方法增强控制力:
-
终止 Worker:主线程调用
worker.terminate(),Worker 内调用self.close() -
错误捕获:主线程监听
worker.onerror;Worker 内可用self.onerror -
导入脚本:Worker 中用
importScripts('a.js', 'b.js')加载依赖(同步阻塞) -
共享内存(高级):通过
SharedArrayBuffer+Atomics实现线程间低开销数据共享(需 HTTPS 或 localhost)
注意事项与限制
Worker 虽强大,但有明确边界,使用前需确认是否适用:
- 无法访问
window、document、parent等全局对象,也不能操作 DOM - 不支持
alert、confirm等同步弹窗(会报错) - 部分 API 不可用,如
localStorage、indexedDB(但可通过主线程代理) - 调试较主线程困难:Chrome DevTools 的 Sources 面板中可找到
workers子目录,支持断点和 console - 每个 Worker 是独立上下文,全局变量不共享,多次
new Worker()会创建多个实例











