在前端 JavaScript 中,可以通过检查全局对象(self
或 window
)的属性来判断当前代码是运行在 Worker 还是 主线程 中。以下是几种常用方法:
1. 通过 self
对象的类型判断
- 主线程:
self
(即window
)会包含浏览器特有的全局属性(如document
,location
)。 - Worker线程:
这些属性不存在,但会有 Worker 特有的 API(如importScripts
,onmessage
)。
function isRunningInWorker() {
// Worker环境中没有 'window',且 self 不是 Window 类型
return (
typeof Window === 'undefined' ||
!(self instanceof Window)
);
}
// 使用示例
if (isRunningInWorker()) {
console.log("运行在 Worker 中");
} else {
console.log("运行在主线程中");
}
2. 直接检测关键 API
根据环境特有的 API 进行更精确的判断:
function isRunningInWorker() {
// Worker环境有 importScripts,主线程有 document
return (
typeof importScripts === 'function' &&
typeof document === 'undefined'
);
}
3. 通过构造函数名称判断
检查 self.constructor.name
:
function isRunningInWorker() {
// DedicatedWorkerGlobalScope / ServiceWorkerGlobalScope / etc.
return /WorkerGlobalScope$/.test(self.constructor.name);
}
4. Webpack/Rollup 等构建工具的兼容性处理
如果代码会被打包工具处理,可能需要更健壮的判断:
const isWorker = (
typeof globalThis !== 'undefined' &&
globalThis.constructor &&
globalThis.constructor.name.match(/WorkerGlobalScope$/)
);
注意事项
- Service Worker / Shared Worker:
- Service Worker:
self instanceof ServiceWorkerGlobalScope
- Shared Worker:
self instanceof SharedWorkerGlobalScope
- Service Worker:
- Node.js 环境:
上述方法不适用 Node.js(需额外判断process
对象)。 - 安全性:避免依赖未标准化的属性。
选择最适合你场景的方法即可!
内容由零声教学AI助手提供,问题来源于学员提问