Worker线程必须用self.onmessage监听主线程消息、self.postMessage回传结果;因无window对象,所有全局操作需基于self,且不可访问document等DOM API。

在 Worker 线程内部监听主线程发来的消息,必须使用 self.onmessage(不能用 window.onmessage 或全局 onmessage),并用 self.postMessage() 将结果发回主线程。
Worker 内部监听消息:用 self.onmessage
Worker 是独立线程,没有 window 对象,所有全局上下文都基于 self(等价于 globalThis)。监听主线程消息的唯一标准方式是:
- 赋值写法:
self.onmessage = function(e) { ... } - 或事件监听写法:
self.addEventListener('message', handler)(支持多次绑定、便于解绑) -
e.data就是主线程通过worker.postMessage(data)发送过来的数据,类型需满足结构化克隆规则(对象、数组、ArrayBuffer 等,不含函数或 DOM 节点)
Worker 向主线程回传结果:用 self.postMessage()
处理完任务后,Worker 必须显式调用 self.postMessage() 才能把结果送回主线程。注意:
- 参数和
worker.postMessage()一样,支持可序列化数据;若传输大块二进制数据(如图像像素),建议配合transferList使用 ArrayBuffer 实现零拷贝 - 例如:
self.postMessage({ type: 'done', result: 12345 }); - 不能用
postMessage()(不带self.前缀),否则会报错或静默失败
完整 Worker 文件示例(calculator.js)
这是可直接被 new Worker('calculator.js') 加载的标准 Worker 脚本:
self.onmessage = function(e) {
const { type, value } = e.data;
if (type === 'sqrt') {
const result = Math.sqrt(value);
self.postMessage({ type: 'sqrt-result', result });
}
};
// 也可改用 addEventListener
// self.addEventListener('message', e => { ... });
常见错误提醒
- ❌ 在 Worker 里写
onmessage = ...(缺少self.)→ 不生效 - ❌ 在 Worker 里调用
postMessage(...)(没加self.)→ 报 ReferenceError 或无反应 - ❌ 尝试在 Worker 中访问
document、localStorage或fetch(除fetch大部分浏览器支持外,其余均不可用) - ✅ 正确姿势始终是
self.onmessage+self.postMessage


















