self是workerglobalscope实例,等价于this,提供postmessage、onmessage、close、importscripts等专用接口,不可赋值或删除,且无dom/bom/ui api。

在 HTML5 Web Worker 中,self 不是关键字,而是指向当前 Worker 全局作用域的引用,等价于 this(在顶层执行环境中),其本质是 WorkerGlobalScope 的实例。它与主线程的 window 类似,但受严格限制:没有 DOM、BOM、document、alert 等浏览器 API,仅支持部分 JavaScript 标准对象和专用 Worker 接口。
self 的真实身份与使用场景
self 是 Worker 内默认可用的全局对象,可显式用于访问 Worker 特有属性和方法,例如:
-
self.postMessage():向创建它的主线程发送消息 -
self.onmessage = handler或self.addEventListener('message', handler):监听主线程发来的消息 -
self.close():主动终止当前 Worker -
self.importScripts('a.js', 'b.js'):同步加载并执行外部脚本(不支持async/await)
注意:self 在 Worker 中不可被重新赋值(严格模式下会报错),也不应被覆盖或删除——它不是变量,而是只读绑定。
Worker 全局作用域的明确边界
Worker 的全局环境与主线程完全隔离,以下内容在 Worker 中不可用:
- 任何 DOM 相关接口:
document、Element、NodeList、querySelector等 - BOM 接口:
window、location、history、navigator(部分属性如navigator.userAgent可读,但非全部) - 同步 I/O 操作:
XMLHttpRequest(虽存在,但仅支持异步)、fetch(支持)、localStorage/sessionStorage(不可用) - UI 相关 API:
alert、confirm、prompt、requestAnimationFrame
可安全使用的包括:setTimeout/setInterval、console(部分浏览器支持)、JSON、ArrayBuffer、TypedArray、Promise、fetch、WebSocket(需注意同源限制)、IndexedDB(支持,但需显式打开)。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
常见误用与规避建议
开发者容易混淆 Worker 和普通脚本的执行环境,导致运行时错误:
- 误写
window.postMessage→ 应改为self.postMessage或直接postMessage(顶层自动绑定到self) - 试图操作
document.body→ 需通过postMessage将数据传回主线程,由主线程更新 UI - 在 Worker 中调用
importScripts后立即使用导入模块的变量 → 必须确保脚本已同步加载完成(无回调机制,失败静默) - 依赖
this在事件监听器中指向self→ 建议统一用self显式引用,避免箭头函数或绑定丢失上下文
调试时可通过 console.log(self.constructor.name) 确认当前环境是否为 WorkerGlobalScope。
与主线程通信是唯一桥梁
Worker 无法绕过消息机制直接影响页面,所有跨线程交互必须基于 postMessage + onmessage(或 MessageChannel 提升性能)。传输对象默认被结构化克隆(不共享内存),如需零拷贝可使用 Transferable 对象(如 ArrayBuffer):
- 主线程发送:
worker.postMessage(data, [data.buffer]) - Worker 接收后,
data.buffer在主线程中失效,仅 Worker 可访问
这种设计保障了线程安全,也决定了 Worker 的定位:专注计算密集型任务,而非界面协调。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










