Web Worker 中变量声明与主线程类似,但作用域隔离:let/const 为块级私有,var 在脚本作用域挂载到 self(模块中不挂载),通信须用 postMessage 传递可序列化数据或 Transferable 对象。

在 Web Worker 中声明变量和在主线程中基本一致,但需注意作用域隔离和上下文限制——Worker 运行在独立的全局环境中(WorkerGlobalScope),没有 window、document 等 DOM 对象,但拥有自己的 self(等价于 globalThis)。
使用 let/const/var 声明局部或全局变量
在 Worker 脚本顶层(即模块作用域或脚本作用域)用 let、const 或 var 声明的变量,属于该 Worker 实例的私有作用域,不会与主线程或其他 Worker 冲突。
-
const和let遵循块级作用域,推荐优先使用 -
var声明的变量会提升并挂载到self上(函数作用域),但不建议依赖此行为 - 顶层声明的变量默认不可被主线程直接访问,通信必须通过
postMessage()
访问 Worker 全局对象 self
self 是 Worker 的全局对象(类似主线程的 window),所有全局变量(包括用 var 在顶层声明的)都会成为 self 的属性(但 let/const 不会)。
例如:
立即学习“Java免费学习笔记(深入)”;
const PI = Math.PI; // 块级,不挂载到 self var version = '1.0'; // 挂载为 self.version self.name = 'calc-worker'; // 显式设置也有效
可通过 self.PI 访问不到 PI,但 self.version 可取到 '1.0'。
避免意外共享:不要用闭包暴露引用
Worker 内部函数形成的闭包可捕获外部变量,但这些变量仍只在当前 Worker 内存中存在。切勿试图通过 postMessage 传递非结构化数据(如函数、class 实例、DOM 节点),它们会被忽略或报错。
- 只传递可序列化的值(字符串、数字、数组、纯对象、
ArrayBuffer等) - 如需共享大内存,用
Transferable(如ArrayBuffer)配合postMessage(data, [buffer])零拷贝传递 - 变量本身不能“跨线程共享”,只能复制或转移
模块 Worker 中的顶层变量(ES Module)
若 Worker 以 type="module" 启动(如 new Worker('worker.js', { type: 'module' })),其顶层是模块作用域:
-
let/const/var声明仅在该模块内有效 - 无自动挂载到
self的行为(var也不挂) - 需显式赋值如
self.myVar = xxx才能从self访问
模块环境下更推荐用 export 组织逻辑,而非依赖全局变量。


















