讲师中心 微信公众号
AI工具推荐 视频效率加速

什么是JavaScriptWebWorkers多线程【教程】

星晨姑娘_9445

星晨姑娘_9445

发布时间:2026-01-17 21:47:24

|

691人浏览过

|

来源于php中文网

原创

Web Workers 是浏览器提供的隔离式后台线程机制,非 JS 多线程;必须用独立同源 JS 文件创建,通过 postMessage 传递数据(结构化克隆),大数组用 Transferable 零拷贝;Worker 内无 DOM、无 localStorage;需显式 terminate() 或 self.close() 防内存泄漏。

什么是javascriptwebworkers多线程【教程】

Web Workers 不是 JavaScript 的“多线程”(因为 JS 本身仍单线程),而是浏览器提供的隔离式后台线程机制——它让你能把 CPU 密集型任务搬出主线程,避免页面卡死。


new Worker('worker.js') 是唯一可靠启动方式

你不能用字符串、内联函数或 data: URL 创建 Worker(Chrome/Firefox 会直接抛 SecurityError: Failed to construct 'Worker')。必须把逻辑写进独立的 .js 文件,并确保同源(file:// 协议下多数浏览器拒绝加载)。

  • ✅ 正确:const worker = new Worker('./math-worker.js');
  • ❌ 错误:new Worker('data:text/javascript, self.postMessage(42)'); 或 new Worker(`self.onmessage=...`)
  • ⚠️ 构建工具友好写法(Vite/Webpack):new Worker(new URL('./math-worker.js', import.meta.url)),支持模块导入

postMessage 传参不等于“共享内存”,结构化克隆很关键

主线程和 Worker 之间所有数据都走 postMessage(),但默认不是引用传递,而是用结构化克隆算法(structured clone)深拷贝。这意味着:

  • 传 {a: 1, fn: () => {}} → fn 字段直接消失(函数不可克隆)
  • 传 document.body → 立即报错 ReferenceError: document is not defined(Worker 没 DOM)
  • 传百万级 ArrayBuffer → 内存翻倍 + 序列化延迟,UI 可能卡顿

大二进制数据请用 Transferable 零拷贝:

立即学习“Java免费学习笔记(深入)”;

const buffer = new ArrayBuffer(10 * 1024 * 1024); // 10MB
worker.postMessage(buffer, [buffer]); // 第二个参数移交所有权

移交后,主线程的 buffer 变成 detached,再读会抛 TypeError: array buffer is detached。

jm-jsjkxyjs02-zlm-405
jm-jsjkxyjs02-zlm-405

使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。

下载

Worker 里能用什么?不能用什么?边界必须清楚

Worker 有自己独立的全局对象 self(类似主线程的 window),但 API 集大幅裁剪:

  • ✅ 可用:console(输出在 DevTools → “Workers” 标签页)、fetch、setTimeout、WebAssembly、indexedDB
  • ❌ 不可用:document、window、localStorage、XMLHttpRequest(改用 fetch)、alert、parent
  • ⚠️ 注意:console.log 能用,但容易被忽略——别靠它调试,加 onerror 监听更靠谱

常见错误:在 worker.js 里写 document.getElementById(),运行即崩,报 ReferenceError: document is not defined,这不是 bug,是设计如此。


别忘了 terminate(),否则线程常驻内存

Worker 实例不会自动销毁。哪怕任务做完、onmessage 处理完,线程仍在后台运行,持续占用内存和 CPU 资源。

  • ✅ 显式终止:worker.terminate();(主线程调用)
  • ✅ Worker 自毁:self.close();(Worker 内部调用)
  • ⚠️ 忘记终止 → 多个 Worker 积累后,页面内存飙升,Chrome 任务管理器里能看到 “Worker” 进程持续存在

尤其在动态创建 Worker 的场景(如用户反复点击“开始计算”),不 terminate() 就等于内存泄漏。

实际用起来最易忽略的,是 transferable 的移交时机和 detached buffer 的二次读取;还有就是以为 console.log 能像主线程一样随时看到输出——它藏在 Workers 标签页里,很多人压根没打开过。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

2906

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5939

2023.11.06

Chrome开启无痕模式
Chrome开启无痕模式

本专题整合了Chrome无痕模式开启相关内容,阅读专题下面的文章了解更多详细教程。

4227

2026.03.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2378

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1878

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3024

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6284

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6289

2023.11.24

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn