Web Worker 是与主线程完全隔离的独立执行环境,拥有独立全局对象(self)、无 DOM 接口、变量函数无法跨线程访问,通信仅支持结构化克隆或可转移对象,模块加载也相互独立。

Web Worker 的作用域不是“扩展”或“继承”主线程的作用域,而是完全新建、互不感知的独立执行环境。这种隔离不是靠语法限制实现的,而是由浏览器在底层线程和内存层面强制保障的。
每个 Worker 拥有自己的一套全局对象
主线程里的 window、document、localStorage 在 Worker 里根本不存在;Worker 里的全局对象是 self(等价于 globalThis),它只提供有限的安全 API,比如 fetch、setTimeout、console、IndexedDB,但没有 DOM 相关接口。你不能在 Worker 里写 document.body.appendChild(),连语法解析都会报错——因为 document 这个变量压根没被声明。
变量和函数无法跨线程直接访问
主线程定义的 const config = { timeout: 5000 }; 不会自动出现在 Worker 里;Worker 内定义的 function helper() {} 也不会被主线程调用。这不是“作用域链查不到”,而是两个 JS 引擎实例各自运行,彼此的堆内存物理隔离。就像两个不同网页打开的标签页,互相看不见对方的变量。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
通信只能靠结构化克隆或可转移对象
- 普通数据(字符串、数字、普通对象、数组)通过
postMessage()自动做结构化克隆:复制一份新数据传过去,原数据不受影响 - 大体积数据(如
ArrayBuffer、TypedArray)可用 Transferable Objects:把内存控制权直接移交,主线程传完就无法再读写该缓冲区,避免拷贝开销 - 不可克隆的对象(
function、undefined、DOM node、RegExp等)无法传递,会静默丢弃或报错
模块加载也各自独立
Worker 可以用 importScripts() 或 ES 模块方式(new Worker('worker.js', { type: 'module' }))加载脚本,但它加载的模块路径、缓存、顶层作用域都与主线程分开。即使主线程和 Worker 都 import 同一个 utils.js,它们得到的是两份完全独立的模块实例,导出的变量也不共享。
立即学习“Java免费学习笔记(深入)”;

















