Worker 线程中全局对象是 self 而非 window,它是 WorkerGlobalScope 实例,等价于顶层 this 和 globalThis;提供 postMessage、onmessage、close、importScripts 等专用接口,不支持 DOM、BOM UI 和同步存储 API。

在浏览器 Worker 线程中,全局作用域不叫 window,而是由 self 对象代表。
self 就是 Worker 的全局对象
Worker 运行在独立线程,没有窗口概念,因此不存在 window。它的顶层执行环境是 WorkerGlobalScope 实例,而 self 就是这个实例的引用——等价于该线程中的 this(在脚本顶层),也等同于 globalThis(ES2020+)。
-
self === this在 Worker 脚本顶层为 true -
self === globalThis同样为 true(现代浏览器) -
self不可赋值、不可删除,是只读绑定
self 提供 Worker 专用接口
它暴露了主线程中 window 所不具备的、但专属于 Worker 的能力:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
self.postMessage():向创建它的主线程发送消息 -
self.onmessage = handler或self.addEventListener('message', ...):接收主线程发来的数据 -
self.close():主动终止当前 Worker -
self.importScripts('a.js', 'b.js'):同步加载外部脚本(不支持async/await) -
self.caches、self.indexedDB、self.performance、self.navigator(有限属性)等只读属性
self 与 window 的关键区别
虽然语义上 self 类似 window,但它被严格限制:
立即学习“Java免费学习笔记(深入)”;
- ❌ 没有 DOM 接口:
document、Element、querySelector全部不可用 - ❌ 没有 BOM UI API:
alert、location(仅部分 WorkerLocation 属性可用)、history、requestAnimationFrame - ❌ 无同步存储:
localStorage、sessionStorage不可用 - ✅ 可用标准能力:
setTimeout、Promise、fetch、WebSocket、ArrayBuffer、console(部分支持)
为什么不能用 window?
Worker 线程从启动起就与渲染上下文隔离。试图访问 window 会直接报 ReferenceError: window is not defined。这不是兼容性问题,而是规范强制设计——确保线程安全与内存隔离。所有全局操作必须通过 self 显式发起,这是唯一合法入口。

















