Web Worker 可实现 JavaScript 的多线程并发,避免阻塞主线程;它在独立上下文运行,无法访问 DOM,仅通过 postMessage/onmessage 与主线程通信,支持结构化克隆传输数据。
JavaScript 本身是单线程的,但通过 Web Worker 可以在后台运行独立的脚本线程,实现真正的并发执行,避免阻塞主线程(尤其是 UI 渲染和用户交互)。
Worker 在独立上下文中运行,不能直接访问 DOM、window 或 document 对象,只能通过消息机制与主线程通信。
new Worker('worker.js') 加载并启动一个 JS 文件worker.postMessage(data),支持结构化克隆(可传对象、数组、ArrayBuffer 等)worker.onmessage = e => { console.log(e.data) }
self.onmessage 接收,self.postMessage() 发送主
线程中:
const worker = new Worker('fib-worker.js');
worker.postMessage(40); // 请求计算第40项
worker.onmessage = e => {
console.log('结果:', e.data); // 避免主线程被长计算阻塞
};
在 fib-worker.js 中:
self.onmessage = function(e) {
const n = e.data;
function fib(n) { return n <= 1 ? n : fib(n-1) + fib(n-2); }
self.postMessage(fib(n));
};
alert、fetch(可用)、setTimeout(可用),但无 document、localStorage(可用 indexedDB)importScripts('a.js', 'b.js') 加载其他脚本(同步阻塞)worker.terminate(),Worker 自己调用 self.close()
crossorigin 和 COOP/COEP 头)