什么是Web Workers_JavaScript中如何创建和使用Web Worker
发布时间 - 2026-01-05 00:00:00 点击率:次Web Workers 不能直接操作 DOM 或访问 window、document 等主线程对象,需通过 postMessage 通信;必须从同源外部文件加载,支持 fetch(不含 credentials: 'include'),用 self 替代 window,可调试且应按需使用。
Web Workers 不能直接操作 DOM,也不能访问 window、document、localStorage 等主线程专属对象——这是使用前必须接受的前提。
为什么主线程卡住时 Worker 仍能运行
浏览器把 JavaScript 执行分为「主线程」和「独立线程」。Web Worker 在后台新开一个 JS 线程,与主线程内存隔离,靠 postMessage() 通信。所以即使主线程正执行 while(true) 或大量计算,Worker 里的代码照常跑。
如何创建并启动一个 Web Worker
Worker 必须从外部文件加载,不能内联脚本。路径需满足同源限制,且不能是 file:// 协议(本地双击 HTML 会失败)。
- 新建文件
worker.js,写入处理逻辑(例如:self.onmessage = function(e) { const result = e.data * 2; self.postMessage(result); };) - 在主页面中创建实例:
const worker = new Worker('worker.js'); - 发送数据:
worker.postMessage(42);
- 监听返回:
worker.onmessage = function(e) { console.log('结果:', e.data); // 输出 84 };
常见报错和绕不过的限制
SecurityError: Failed to construct 'Worker' 多半是跨域或 file:// 加载;ReferenceError: window is not defined 是误在 Worker 里调用了 DOM API。
- Worker 内部用
self代替window,全局作用域就是self - 不能用
fetch?可以,但不支持credentials: 'include'(除非显式配置credentials: 'same-origin') - 想共享数据?不行。只能序列化后传值(
postMessage()底层调用结构化克隆算法),function、undefined、Symbol会被丢弃 - 终止 Worker:
worker.terminate(),之后它不能再收发消息
多个 Worker 或复杂任务怎么组织
每个 new Worker() 启动一个新线程,开销不小。高频创建/销毁不如复用;需要频繁通信时,注意避免主线程被大量 onmessage 回调阻塞。
- 用
importScripts('lib1.js', 'lib2.js')在 Worker 内加载依赖(路径相对于worker.js) - 想让 Worker 主动终止自己?用
self.clo
se() - 调试 Worker:Chrome DevTools 的
Sources > Threads面板能看到独立上下文,断点也有效 - 替代方案考虑:
SharedArrayBuffer+Atomics(需 HTTPS +cross-origin-isolated头),但兼容性差,目前多数场景仍用postMessage
真正麻烦的不是“怎么写”,而是判断“该不该用”——简单计时器、小数组排序完全没必要 Worker;但图像像素处理、加密解密、大型 JSON 解析,就值得拆出去。别为了用而用。
# javascript
# java
# html
# js
# json
# 浏览器
# ai
# win
# 跨域
# 作用域
# 为什么
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
实现点击下箭头变上箭头来回切换的两种方法【推荐】
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
常州企业网站制作公司,全国继续教育网怎么登录?
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
jQuery validate插件功能与用法详解
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
高端企业智能建站程序:SEO优化与响应式模板定制开发
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
七夕网站制作视频,七夕大促活动怎么报名?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
jQuery中的100个技巧汇总
香港服务器网站推广:SEO优化与外贸独立站搭建策略
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Windows Hello人脸识别突然无法使用
php 三元运算符实例详细介绍
简单实现Android验证码
如何用AI帮你把自己的生活经历写成一个有趣的故事?
如何在阿里云部署织梦网站?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel如何使用Telescope进行调试?(安装和使用教程)
如何快速查询网站的真实建站时间?
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Python3.6正式版新特性预览
如何在宝塔面板创建新站点?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
香港服务器选型指南:免备案配置与高效建站方案解析
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
php结合redis实现高并发下的抢购、秒杀功能的实例
如何彻底删除建站之星生成的Banner?
html5的keygen标签为什么废弃_替代方案说明【解答】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?


se()